【问题标题】:GLFW - linker errors on UBuntu 14.04 LTSGLFW - UBuntu 14.04 LTS 上的链接器错误
【发布时间】:2014-08-12 06:44:26
【问题描述】:

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

使用静态库有什么问题?

【问题讨论】:

  • 我没有找到任何解决我的问题的方法。
  • 在 CMake 术语中是什么意思?像这样:target_link_libraries(glfw_test X11 ${OPENGL_gl_LIBRARY}) ?
  • 我对 CMake 不太熟悉,但我认为你说的是​​对的......当你尝试时会发生什么?
  • 它不能解决问题。我得到了同样的信息。

标签: opengl ubuntu linker cmake glfw


【解决方案1】:

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

Firsterror adding symbols: DSO missing from command line 显示链接器命令行参数的错误顺序。这个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( myProject ${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()

【讨论】:

    【解决方案2】:

    您似乎通过将 GLFW 重新构建为共享库并将示例代码与其链接来解决了您自己的问题。相反,我将尝试回答您的后续问题,即为什么当您尝试链接静态库时它不起作用。

    基本上,如果你想链接静态库libglfw3.a,你需要链接所有依赖的X11库。链接静态库时出现错误,因为您没有指定要链接的任何其他库,并且 CMake 不知道这些依赖项是什么。链接共享库 libglfw.so 时不会出现错误,因为 X11 库已链接到共享库,并且 CMake 知道会自动为您提取这些库。

    如果要使用静态库,可以如下确定需要链接的库。根据 GLFW 中的 .pc 文件,您可以在命令行中键入以下内容以了解它们是什么:

    pkg-config --static --libs x11 xrandr xi xxf86vm gl
    

    如果你把它翻译成一个 CMake 命令,它看起来像这样:

    target_link_libraries( glfw_test glfw3 Xrandr Xrender Xi GL m dl drm Xdamage X11-xcb xcb-glx xcb-dri2 xcb-dri3 xcb-present xcb-sync xshmfence Xxf86vm Xfixes Xext X11 pthread xcb Xau Xdmcp)
    

    因此,如果您将其添加到 CMakeLists.txt,示例代码应该可以毫无问题地构建。

    顺便说一句,您可以通过以下方式使用 CMake 自动查找 X11 库:

    find_package(X11 REQUIRED)
    target_link_libraries( my_program ${X11_LIBRARIES} )
    

    但是,X11_LIBRARIES 变量中存储的库集将仅包含静态链接 GLFW 所需的库子集。

    我不太确定如何正确处理 CMake 中的静态/动态链接,但我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2016-02-01
      • 2015-05-31
      • 2015-08-30
      • 1970-01-01
      • 2014-06-04
      相关资源
      最近更新 更多