2016-08-15 132 views
0

我想編譯一個簡單的FLTK程序,但它總是會帶來鏈接錯誤。當我建立這個命令,它的工作原理fltk cmake ubuntu鏈接錯誤

g++ -I/usr/local/include \ 
    -I/usr/include/freetype2 \ 
    -D_LARGEFILE_SOURCE \ 
    -D_LARGEFILE64_SOURCE \ 
    -D_THREAD_SAFE \ 
    -D_REENTRANT \ 
    -o 'ex01' './ex01.cxx' /usr/local/lib/libfltk.a \ 
    -lXcursor -lXfixes -lXext -lXft -lfontconfig \ 
    -lXinerama -lpthread -ldl -lm -lX11 

當我嘗試CMake的這些行:

CMAKE_MINIMUM_REQUIRED(VERSION 3.6.1) 
PROJECT(ex01) 
FIND_PACKAGE(FLTK REQUIRED) 
FIND_PACKAGE(OpenGL REQUIRED) 
ADD_EXECUTABLE(ex01 ex01.cxx) 
TARGET_INCLUDE_DIRECTORIES(ex01 PUBLIC ${FLTK_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) 
TARGET_LINK_LIBRARIES(ex01 ${FLTK_LIBRARIES} ${OPENGL_LIBRARIES}) 

我得到這個錯誤:

[100%] Linking CXX executable ex01 
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libfltk.a(Fl_x.o): undefined reference to symbol '[email protected]@GLIBC_2.2.5' 
//lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 
make[2]: *** [ex01] Error 1 
make[1]: *** [CMakeFiles/ex01.dir/all] Error 2 
make: *** [all] Error 2 

我的系統有Ubuntu的14和cmake的3.6.1。任何建議?有沒有辦法將以前的g ++選項添加到CMakeLists.txt文件中? 非常感謝! 易卜拉欣

+0

您可能也忘記添加預處理器定義。通過詳細的cmake/make運行來查看實際的編譯器調用。您需要['target_compile_definitions()'](https://cmake.org/cmake/help/v3.5/command/target_compile_definitions.html)來指定定義。 –

+0

再次感謝。 target_compile_definitions()需要micros。我使用了TARGET_COMPILE_OPTIONS(ex01 PUBLIC -lXcursor -lXfixes -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11) ,但仍然得到相同的錯誤 – Ibraheem

+0

'target_compile_definitions'和'target_compile_options'是兩個完全不同的東西。我已經更新了我的答案。所有這些手動添加的'-l ...'應該已經被'$ {FLTK_LIBRARIES}'和'$ {OPENGL_LIBRARIES}'覆蓋。 –

回答

0

你是不是添加了依賴庫FLTK的OpenGL的包括目錄。 查找模塊提供了這些變量。

使用target_include_directories()

target_include_directories(ex01 
          PUBLIC ${FLTK_INCLUDE_DIR} 
            ${OPENGL_INCLUDE_DIR}) 

編輯
此外,你缺少的預處理器定義

-D_LARGEFILE_SOURCE 
-D_LARGEFILE64_SOURCE 
-D_THREAD_SAFE 
-D_REENTRANT 

你需要通過target_compile_definitions()定義他們爲你的可執行文件:

target_compile_definitions(ex01 
          PUBLIC _LARGEFILE_SOURCE 
            _LARGEFILE64_SOURCE 
            _THREAD_SAFE 
            _REENTRANT) 

任何進一步的CMake調試使用CMAKE_VERBOSE_MAKEILFEmake打印出來的編譯器調用。這會告訴你還有什麼遺漏。


附註:您是否確實需要CMake 2.6?只要你不需要支持不提供最近CMake的系統,我建議至少要求CMake版本3.0。

+0

感謝您的回答,我嘗試了您的解決方案,但現在我得到此錯誤:CMakeLake.txt中的CMake錯誤:13(TARGET_INCLUDE_DIRECTORIES): target_include_directories使用無效參數調用。 – Ibraheem

+0

對不起,搞砸了語法。修復。無論如何,你應該閱讀該文檔! –

+0

再次感謝,我嘗試了新的語法,但現在又返回到以前的錯誤。我更新了問題中的內容。 – Ibraheem

0

我在這裏得到了幫助: https://groups.google.com/forum/#!topic/fltkgeneral/GWlW6KiYnKM 現在它工作:)。 我必須:1-使用cmake下載並構建fltk的最新版本。 2更改CMakeLists.txt是這樣的:
CMAKE_MINIMUM_REQUIRED(VERSION 3.6) PROJECT(ex01) FIND_PACKAGE(FLTK REQUIRED NO_MODULE) # must use "NO_MODULE" include_directories(${FLTK_INCLUDE_DIRS}) link_directories(${FLTK_LIBRARY_DIRS}) add_definitions(${FLTK_DEFINITIONS})
ADD_EXECUTABLE(ex01 ex01.cxx) TARGET_LINK_LIBRARIES(ex01 fltk) # notice fltk here