gpt4 book ai didi

c++ - 使用 CMake、DSO-Link-Change 链接失败

转载 作者:行者123 更新时间:2023-11-30 02:55:59 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于c++ - 使用 CMake、DSO-Link-Change 链接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15974364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com