【发布时间】:2013-04-05 03:47:44
【问题描述】:
几个月前我在 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,都产生相同的错误。
【问题讨论】:
-
我不记得库的顺序在 CMake 中是否重要(即它是否以正确的顺序将它们提供给 GCC),但这对于 GCC 本身来说肯定很重要。也许你应该把
MyLib放在${OpenCV_LIBS}之前? -
哦,伙计,你一定是在开玩笑吧...当 MyLib 依赖于 ${OpenCV_LIBS} 时,它必须在 cmdline 之前运行?这对我来说非常不直观,我的想法是,首先你必须链接到 ${OpenCV_LIBS} (然后它是“定义的”),然后链接到依赖于 ${OpenCV_LIBS} 并且现在能够找到它的 MyLib...但实际上你是对的,自从我使用 gcc 以来我就错了......如果你把它作为答案,我会接受...... :-) 谢谢,太愚蠢了......