1

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

4

2 回答 2

2

GCC 对您在链接阶段指定库的顺序非常敏感。例如,如果libA.a依赖于libB.a并且一个可执行文件App同时依赖于两者,那么您必须通过以下方式调用链接器:

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

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

于 2013-04-12T15:36:37.967 回答
1

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

于 2013-04-12T14:53:24.090 回答