我正在尝试编译一个简单的FLTK程序,但它总是带来链接错误。当我使用此命令构建时,它可以工作
g++ -I/usr/local/include \
-I/usr/include/freetype2 \
-D_LARGEFILE_SOURCE \
-D_LARGEFILE64_SOURCE \
-D_THREAD_SAFE \
-D_REENTRANT \
-o 'ex01' './ex01.cxx' /usr/local/lib/libfltk.a \
-lXcursor -lXfixes -lXext -lXft -lfontconfig \
-lXinerama -lpthread -ldl -lm -lX11当我使用以下代码行尝试cmake时:
CMAKE_MINIMUM_REQUIRED(VERSION 3.6.1)
PROJECT(ex01)
FIND_PACKAGE(FLTK REQUIRED)
FIND_PACKAGE(OpenGL REQUIRED)
ADD_EXECUTABLE(ex01 ex01.cxx)
TARGET_INCLUDE_DIRECTORIES(ex01 PUBLIC ${FLTK_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(ex01 ${FLTK_LIBRARIES} ${OPENGL_LIBRARIES})我得到了这个错误:
[100%] Linking CXX executable ex01
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libfltk.a(Fl_x.o): undefined reference to symbol 'dlsym@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [ex01] Error 1
make[1]: *** [CMakeFiles/ex01.dir/all] Error 2
make: *** [all] Error 2我的系统是Ubuntu 14和cmake 3.6.1。有什么建议吗?有没有办法将前面的g++选项添加到CMakeLists.txt文件?非常感谢!易卜拉欣
发布于 2016-08-16 23:49:09
我在这里得到了帮助:https://groups.google.com/forum/#!topic/fltkgeneral/GWlW6KiYnKM Now it works :)。我不得不: 1-使用cmake下载并构建fltk的最新版本。2-将CMakeLists.txt更改为:
`CMAKE_MINIMUM_REQUIRED(VERSION 3.6) PROJECT(ex01) FIND_PACKAGE(FLTK REQUIRED NO_MODULE) # must use "NO_MODULE" include_directories(${FLTK_INCLUDE_DIRS}) link_directories(${FLTK_LIBRARY_DIRS}) add_definitions(${FLTK_DEFINITIONS})` `ADD_EXECUTABLE( ex01 ex01.cxx ) TARGET_LINK_LIBRARIES( ex01 fltk ) # notice fltk here`发布于 2018-09-26 22:34:59
问题是Ubuntu14附带的CMake文件并没有为静态FLTK库指定所有需要的链接器标志。
fltk-config --ldstaticflags的输出为:
... -lXext -lXft -lfontconfig -lfontconfig -lXinerama -ldl -lm -lX11而/usr/lib/fltk/FLTKLibraries-noconfig.cmake第18行仅包含:
-lXft;-lfontconfig;-lXinerama;-lX11;-lm解决方案是手动链接Xext和dl库。完整的代码是:
find_package(FLTK REQUIRED NO_MODULE)
include(${FLTK_USE_FILE})
target_link_libraries(app fltk Xext dl)或者,您也可以链接到共享库:
target_link_libraries(app fltk_SHARED)发布于 2016-08-16 03:12:02
您没有为依赖库FLTK和OpenGL添加包含目录。Find模块提供了这些变量。
使用target_include_directories()
target_include_directories(ex01
PUBLIC ${FLTK_INCLUDE_DIR}
${OPENGL_INCLUDE_DIR})编辑
此外,您还缺少预处理器定义
-D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE
-D_THREAD_SAFE
-D_REENTRANT您需要通过target_compile_definitions()为您的可执行文件定义它们
target_compile_definitions(ex01
PUBLIC _LARGEFILE_SOURCE
_LARGEFILE64_SOURCE
_THREAD_SAFE
_REENTRANT)对于任何进一步的CMake调试,使用CMAKE_VERBOSE_MAKEILFE让make打印出编译器调用。它会告诉你还缺了什么。
附注:你真的需要CMake 2.6吗?只要你不需要支持不提供最新CMake的系统,我建议你至少需要CMake 3.0版。
https://stackoverflow.com/questions/38961046
复制相似问题