2014-06-21 116 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)