【问题标题】:fltk cmake ubuntu link errorfltk cmake ubuntu 链接错误
【发布时间】: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_def‌initions() 需要 micros。我改用了 TARGET_COMPILE_OPTIONS(ex01 PUBLIC -lXcursor -lXfixes -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11 ) 但仍然得到同样的错误
  • target_compile_definitionstarget_compile_options 是两个完全不同的东西。我已经更新了我的答案。您手动添加的所有这些-l... 应该已经被${FLTK_LIBRARIES}${OPENGL_LIBRARIES} 覆盖。
  • 试过了,还是一样的错误。

标签: ubuntu linker cmake fltk


【解决方案1】:

我在这里得到了帮助: https://groups.google.com/forum/#!topic/fltkgeneral/GWlW6KiYnKM 现在它可以工作了:)。 我必须: 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

【讨论】:

  • 这在 Ubuntu16 和 fltk 版本 1.3.4 中对我有用
【解决方案2】:

问题在于 Ubuntu 14 附带的 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

解决方案是手动链接Xextdl 库。完整代码为:

find_package(FLTK REQUIRED NO_MODULE)
include(${FLTK_USE_FILE})
target_link_libraries(app fltk Xext dl)

或者,您也可以链接到共享库:

target_link_libraries(app fltk_SHARED)

【讨论】:

    【解决方案3】:

    您没有为依赖库 FLTKOpenGL 添加包含目录。 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_MAKEILFEmake 打印出编译器调用。这会告诉你还缺少什么。


    旁注:你真的需要 CMake 2.6 吗?只要您不必支持不提供最新 CMake 的系统,我建议您至少需要 CMake 3.0 版。

    【讨论】:

    • 感谢您的回答,我尝试了您的解决方案,但现在我收到此错误:CMakeLists.txt:13 (TARGET_INCLUDE_DIRECTORIES) 处的 CMake 错误:使用无效参数调用 target_include_directories。
    • 对不起,搞砸了语法。修复。无论如何,您应该阅读该文档!
    • 再次感谢,我尝试了新语法,但现在又回到了之前的错误。我更新了问题中的内容。
    猜你喜欢
    • 2012-09-25
    • 2014-04-19
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多