使用CMake、DSO-Link-Change连接失败
Linking fails with CMake, DSO-Link-Change
几个月前在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是作为共享库拉进来的,然后应用程序的链接失败,出现了上面的错误。
我也试着建立我自己的共享库,但这导致了更多的错误。我的库的cmakelist看起来像
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
限定符相同的方式对待它。:)
OpenCV_LIBS包含-lopencv_imgproc吗?如果没有,尝试手动添加-lopencv_imgproc链接命令行(运行make V=1)如果可以,添加到TARGET_LINK
相关文章:
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 从 Linux OMI (omicli) 到 Windows WMI 的连接失败,并出现与 DMTF 相关的错误
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- C++ 链表合并排序的实现在连接 1 个以上节点的子列表时失败
- Eclipse:错误:初始化模式失败(无法连接到目标)
- 什么时候标准::线程::连接会因no_such_process而失败
- 连接到套接字失败 - 错误编号 88 (CPP)
- DirectX 11 GetDisplayModeList() 在远程桌面连接中失败
- C/C++ 套接字:如果我在 IPv6 TCP 连接之前执行任何操作,则连接将失败
- vcpkg 安装失败,并显示"SSL 连接错误"
- Wlanconnect连接尝试失败
- 按钮连接Qt失败
- 在应用程序中检查互联网连接C++可靠方法:gethostbyname() 失败
- ADO 连接创建实例在 Windows Server 2003 上失败
- Unix 服务器 - Windows 客户端,连接失败
- 彭博 API 连接问题 - <本地主机:8194> 连接失败
- 如何在连接失败后清理套接字
- 使用CMake、DSO-Link-Change连接失败
- 客户端连接()失败,服务器端接受()成功.为什么
- CGAL + Polygon_set连接失败