【发布时间】:2016-08-15 18:45:31
【问题描述】:
我正在尝试编译一个简单的 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 文件中? 非常感谢! 易卜拉欣
【问题讨论】:
-
您可能还忘记添加预处理器定义。使用详细的 cmake/make 运行检查以查看实际的编译器调用。您需要
target_compile_definitions()来指定定义。 -
再次感谢。 target_compile_definitions() 需要 micros。我改用了 TARGET_COMPILE_OPTIONS(ex01 PUBLIC -lXcursor -lXfixes -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11 ) 但仍然得到同样的错误
-
target_compile_definitions和target_compile_options是两个完全不同的东西。我已经更新了我的答案。您手动添加的所有这些-l...应该已经被${FLTK_LIBRARIES}和${OPENGL_LIBRARIES}覆盖。 -
试过了,还是一样的错误。