首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fltk cmake ubuntu链接错误

fltk cmake ubuntu链接错误
EN

Stack Overflow用户
提问于 2016-08-16 02:45:32
回答 3查看 1.2K关注 0票数 0

我正在尝试编译一个简单的FLTK程序,但它总是带来链接错误。当我使用此命令构建时,它可以工作

代码语言:javascript
复制
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时:

代码语言:javascript
复制
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})

我得到了这个错误:

代码语言:javascript
复制
[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文件?非常感谢!易卜拉欣

EN

回答 3

Stack Overflow用户

发布于 2016-08-16 23:49:09

我在这里得到了帮助:https://groups.google.com/forum/#!topic/fltkgeneral/GWlW6KiYnKM Now it works :)。我不得不: 1-使用cmake下载并构建fltk的最新版本。2-将CMakeLists.txt更改为:

代码语言:javascript
复制
 `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})`
代码语言:javascript
复制
 `ADD_EXECUTABLE( ex01 ex01.cxx )      TARGET_LINK_LIBRARIES( ex01 fltk ) # notice fltk here`
票数 1
EN

Stack Overflow用户

发布于 2018-09-26 22:34:59

问题是Ubuntu14附带的CMake文件并没有为静态FLTK库指定所有需要的链接器标志。

fltk-config --ldstaticflags的输出为:

代码语言:javascript
复制
... -lXext -lXft -lfontconfig -lfontconfig -lXinerama -ldl -lm -lX11

/usr/lib/fltk/FLTKLibraries-noconfig.cmake第18行仅包含:

代码语言:javascript
复制
-lXft;-lfontconfig;-lXinerama;-lX11;-lm

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

代码语言:javascript
复制
find_package(FLTK REQUIRED NO_MODULE)
include(${FLTK_USE_FILE})
target_link_libraries(app fltk Xext dl)

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

代码语言:javascript
复制
target_link_libraries(app fltk_SHARED)
票数 1
EN

Stack Overflow用户

发布于 2016-08-16 03:12:02

您没有为依赖库FLTK和OpenGL添加包含目录。Find模块提供了这些变量。

使用target_include_directories()

代码语言:javascript
复制
target_include_directories(ex01
                           PUBLIC ${FLTK_INCLUDE_DIR}
                                  ${OPENGL_INCLUDE_DIR})

编辑

此外,您还缺少预处理器定义

代码语言:javascript
复制
-D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE
-D_THREAD_SAFE
-D_REENTRANT

您需要通过target_compile_definitions()为您的可执行文件定义它们

代码语言:javascript
复制
target_compile_definitions(ex01
                           PUBLIC _LARGEFILE_SOURCE
                                  _LARGEFILE64_SOURCE
                                  _THREAD_SAFE
                                  _REENTRANT)

对于任何进一步的CMake调试,使用CMAKE_VERBOSE_MAKEILFEmake打印出编译器调用。它会告诉你还缺了什么。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38961046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档