几个月前我在 linux 上编译良好的软件停止在我的新 ubuntu 上编译:
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,都产生相同的错误。