我想从这个 site 编译一个示例代码(在底部)。我下载了 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)
当我运行 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
怎么了?
编辑1 当我将 GLFW 构建为动态库时,一切正常。然后我的 CMakeLists.txt 中的最后一行必须替换为:
target_link_libraries(glfw_test glfw)
使用静态库有什么问题?
最佳答案
我在 Ubuntu 14.04 LTS 上遇到了同样的问题。
第一:错误添加符号:命令行中缺少 DSO
显示链接器命令行参数的错误顺序。这post让我意识到这一点。您需要调用 $ make VERBOSE=1
来查看链接器调用并亲眼检查。请记住:TARGET_LINK_LIBRARIES()
应该是您的 CMakeLists.txt
中的最后一个命令并查看此 order explanation .
第二:如果您针对静态 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
现在使用 $ make VERBOSE=1
再次检查链接器库参数,您应该会发现更多 X11 库,例如:
-lXrandr -lXi -lXrender -ldrm -lXdamage -lXxf86vm -lXext -lX11
和 -lpthread
。
第三:当链接到共享库时,对 X11 等的依赖是动态解析的。这就是为什么您不需要显式地将 X11 库标志添加到链接器的原因。在这种情况下,您只需要:
TARGET_LINK_LIBRARIES(我的项目 ${GLFW_LIBRARIES})
第四:发生在我身上,一些 glfwCommands 有 undefined reference to
- 链接器错误。我发现,我在 /usr/local/lib
中安装了 GLFW3,但链接器只获得了 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()
关于opengl - GLFW - UBuntu 14.04 LTS 上的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345384/