我的軟件編譯的Linux精細幾個月前停止編譯在我的新的Ubuntu:鏈接失敗,CMake的,DSO-鏈路變化
Linking CXX executable myApp
/usr/bin/ld: ../libMyLib/libMyLib.a(MyFile.cpp.o): undefined reference to symbol '_ZN2cv6resizeERKNS_11_InputArrayERKNS_12_OutputArrayENS_5Size_IiEEddi'
/usr/bin/ld: note: '_ZN2cv6resizeERKNS_11_InputArrayERKNS_12_OutputArrayENS_5Size_IiEEddi' is defined in DSO /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libopencv_imgproc.so so try adding it to the linker command line
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libopencv_imgproc.so: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
make[2]: *** [myApp/myApp] Error 1
make[1]: *** [myApp/CMakeFiles/myApp.dir/all] Error 2
make: *** [all] Error 2
我想這是關係到https://fedoraproject.org/wiki/UnderstandingDSOLinkChange。
我的項目(所有的cmake)包含幾個庫和一個應用程序,庫和應用程序都依賴於opencv和/或boost(每個都有一些不同的)。我自己的庫被構建爲.a文件,ocv/boost作爲共享庫被引入,然後應用程序的鏈接失敗,出現上述錯誤。
我也嘗試建立我自己的庫作爲SHARED,但這導致更多的錯誤。我的圖書館的CMakeLists樣子
FIND_PACKAGE(Boost REQUIRED)
FIND_PACKAGE(OpenCV REQUIRED core)
...stuff...
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${Boost_INCLUDE_DIRS})
add_library(${SUBPROJECT_NAME} ${SOURCE} ${HEADERS})
應用CMakeLists看起來像
FIND_PACKAGE(OpenCV REQUIRED core imgproc highgui)
include_directories(${OpenCV_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${SUBPROJECT_NAME} ${OpenCV_LIBS} MyLib)
這是正確的,我一直以爲這是本DSO東西,我只是不能做到這一點,但現在的方式它繼續工作。
如果相關,我嘗試使用CMake 2.8.7和2.8.10以及g ++ 4.7.2和4.8,都會產生相同的錯誤。
我不記得圖書館的順序是否在CMake中很重要(即它是否以正確的順序向GCC提供),但它肯定對GCC本身很重要。也許你應該把'MyLib'放在$ {OpenCV_LIBS}之前? –
哦,你得開玩笑我......當MyLib依賴於$ {OpenCV_LIBS}時,它必須在cmdline之前進行嗎?對我來說,這是非常不直觀的,我的想法是,首先你必須鏈接到$ {OpenCV_LIBS}(然後它被「定義」),然後鏈接到取決於$ {OpenCV_LIBS}的MyLib,現在可以找到它... 但實際上你是對的,自從我使用gcc以來,我得到了這個錯誤...如果你將它作爲答案來制定,我會接受... :-)謝謝,這麼愚蠢...... – Ela782