2014-06-21 55 views
4

我想从这个site(底部)编译一个示例代码。我下载了GLFW 3.0.4源代码,并将其构建在自定义位置。我使用了一个默认设置,并且GLFW被构建为一个静态库。我的CMakeLists.txt看起来是这样的:UBuntu 14.04上的GLFW - 链接器错误LTS

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) 

当我运行使我获得以下信息:

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) 

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

+0

可能重复NetBeans](http://stackoverflow.com/questions/23171894/cant-compile-easy-source-in-c-and-opengl-glfw-in-linux-in-netbeans) – Mehrdad

+0

我没有找到任何解决方案对我的问题。 – Irbis

+0

你尝试过'-lX11'吗? – Mehrdad

回答

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,示例代码应该没有问题。

顺便说一句,你可以自动找到下列方式使用C进行X11库:

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

然而,集存储在X11_LIBRARIES变量库将只包含所需库的一个子集静态链接GLFW。

我真的不知道如何正确处理CMake中的静态/动态链接,但我希望这有助于。

5

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

首先error adding symbols: DSO missing from command line示出链接器命令行参数的错误顺序。这post让我意识到这一点。您需要致电$ make VERBOSE=1查看链接器调用并亲自检查。记住:TARGET_LINK_LIBRARIES()应该是您的CMakeLists.txt中的最后一条命令并且看看这个order explanation

:如果您构建的是静态GLFW3库,则所有X11库都不会自动添加到链接器调用中,正如atsui已经在上面显示的那样。在​​中,您可以找到适合您需要的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再次检查连接器的lib参数,你应该找到更多的X11库,如: -lXrandr -lXi -lXrender -ldrm -lXdamage -lXxf86vm -lXext -lX11-lpthread

第三:当与共享库链接时,对X11等的依赖性被动态解析。这就是为什么你不需要明确地将X11 lib标志添加到链接器。在这种情况下,你只需要: 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() 
的[难道在C语言中的Linux在编译来源容易++和OpenGL(GLFW)