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