GLFW - UBuntu 14.04 LTS上的链接器错误

Irb*_*bis 4 opengl ubuntu linker cmake glfw

我想从这个站点编译一个示例代码(在底部).我下载了GLFW 3.0.4源代码,并将其构建在自定义位置.我使用默认设置,GLFW构建为静态库.我的CMakeLists.txt看起来像这样:

cmake_minimum_required(VERSION 2.8)
project(glfw_test_project)

SET(CMAKE_CXX_FLAGS "-Wall -Werror -g -std=c++11")

find_package(OpenGL REQUIRED)

include_directories(/home/user/MyLibs/OpenGL/glfw-3.0.4/include)
link_directories(/home/user/MyLibs/OpenGL/glfw-3.0.4/build/src)

add_executable(glfw_test main.cpp)

target_link_libraries(glfw_test ${OPENGL_gl_LIBRARY})
target_link_libraries(glfw_test glfw3)
Run Code Online (Sandbox Code Playgroud)

当我运行make时,我得到以下信息:

Linking CXX executable glfw_test
/usr/bin/ld: /home/user/MyLibs/OpenGL/glfw-3.0.4/build/src/libglfw3.a(x11_clipboard.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [glfw_test] Error 1
make[1]: *** [CMakeFiles/glfw_test.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

怎么了 ?

Edit1 当我将GLFW构建为动态库时,一切正常.然后我的CMakeLists.txt中的最后一行必须替换为:

target_link_libraries(glfw_test glfw)
Run Code Online (Sandbox Code Playgroud)

使用静态库时出了什么问题?

Vis*_*orZ 6

我在Ubuntu 14.04 LTS上遇到了同样的问题.

第一:error adding symbols: DSO missing from command line显示链接器命令行参数的错误顺序.这篇文章让我意识到了这一点.您需要调用$ make VERBOSE=1才能看到链接器调用并亲自检查它.记住:TARGET_LINK_LIBRARIES()应该是你的最后一个命令CMakeLists.txt并查看这个订单说明.

第二:如果您针对静态GLFW3库进行构建,则所有X11库都不会自动添加到您的链接器调用中,因为atsui已在上面显示.在GLFW-Documentation中,您可以找到适合您需求的cmake变量:${GLFW_STATIC_LIBRARIES}.要使用它并启用更自动的构建过程,请pkg-config查找X11库的所有依赖项:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(myProject)

FIND_PACKAGE( PkgConfig REQUIRED )
pkg_search_module( GLFW3 REQUIRED glfw3 ) # sets GLFW3 as prefix for glfw vars

# now ${GLFW3_INCLUDE_DIR}, ${GLFW3_LIBRARIES} and ${GLFW3_STATIC_LIBRARIES} 
# are set

INCLUDE_DIRECTORIES( ${GLFW3_INCLUDE_DIR} )
ADD_EXECUTABLE( myProject mySource.cpp )

TARGET_LINK_LIBRARIES( myProject ${GLFW_STATIC_LIBRARIES} )
# they include X11 libs
Run Code Online (Sandbox Code Playgroud)

现在再次检查链接器lib参数$ make VERBOSE=1,您应该找到更多的X11库,如: -lXrandr -lXi -lXrender -ldrm -lXdamage -lXxf86vm -lXext -lX11-lpthread.

第三:当链接到共享库时,动态解析对X11等的依赖性.这就是为什么您不需要向链接器显式添加X11 lib标志的原因.在这种情况下,您只需要: TARGET_LINK_LIBRARIES( myProject ${GLFW_LIBRARIES} )

第四:它发生在我身上,有些glfwCommands有undefined reference to- 链接器错误.我发现,我安装了GLFW3 /usr/local/lib但链接器只给出了LD_LIBRARY_PATH设置为的环境变量/usr/lib32.添加参数-L/usr/local/lib解决了参考问题.为了避免它将来我已经设定LD_LIBRARY_PATH=/usr/lib32;/usr/local/lib;.

提示:要检查GLFW cmake变量中的值,请在构建期间打印它们:

FOREACH(item ${GLFW3_STATIC_LIBRARIES})
    MESSAGE(STATUS "  using lib: " ${item})
ENDFOREACH()
Run Code Online (Sandbox Code Playgroud)