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

标签 opengl ubuntu linker cmake glfw

我想从这个 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)

当我运行 ma​​ke 时,我得到以下信息:

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/

相关文章:

c++ - 加快文本渲染性能openGL

C++/OpenGL | "undefined reference to ` _imp__ChoosePixelFormat@ 8`"等等

linux - 如何将 docker 容器与其他用户隔离

python - Selenium 防止 chromedriver 新窗口在 Ubuntu 16.04 LTS 上获得焦点

c++ - mavericks/xcode5.0.1 是如何改变编译器和链接器的?

C 头文件和编译/链接

c - 是否有用于 C 的 3D 可视化库或工具包? (请不要使用 C++!)

c++ - opengl 中鼠标输入背后的数学和偏航/俯仰值

linux - 为什么 TOP 命令的详细列表中列出的 SWAP 大于摘要中的?

c++ - 查找导致 undefined reference 错误的源代码行