链接失败与CMake,DSO-Link-Change

时间:2013-04-12 14:45:37

标签: c++ gcc linker cmake ld

我几个月前在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,都会产生相同的错误。

2 个答案:

答案 0 :(得分:2)

GCC对链接阶段指定库的顺序非常敏感。例如,如果libA.a取决于libB.a而可执行文件App取决于两者,那么您必须以下列方式调用链接器:

gcc main.o object1.o ... object2.o -lA -lB -o App

注意:请注意,虽然A取决于B,但A仍在B之前。作为结论,最独立的工件应该与最后一个相关联。当然,这在某种意义上是违反直觉的,但尝试用与在C ++中应用const限定符相同的方式对待它。 :)

答案 1 :(得分:1)

OpenCV_LIBS是否包含-lopencv_imgproc?   如果没有,尝试手动添加-lopencv_imgproc链接命令行(运行make V = 1)     如果有效,请将其添加到TARGET_LINK