You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

make编译项目报cv::String::deallocate未定义引用错误

故障现象

在build目录下执行cmake ..完成项目配置后,运行make -j8执行编译,出现如下链接报错:

[ 90%] Building CXX object common/CMakeFiles/common.dir/src/utils/path_util.cpp.o
[ 95%] Linking CXX executable myproj
CMakeFiles/myproj.dir/main.cpp.o: In function `cv::String::~String()':
main.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
CMakeFiles/myproj.dir/main.cpp.o: In function `cv::String::operator=(cv::String const&)':
main.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()'
collect2: error: ld returned 1 exit status
CMakeFiles/myproj.dir/build.make:95: recipe for target 'myproj' failed
make[2]: *** [myproj] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/myproj.dir/all' failed
make[1]: *** [CMakeFiles/myproj.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

反常点:业务代码中完全没有显式使用cv::String类型。
已做配置:已在多个CMakeLists.txt中添加如下OpenCV依赖查找配置,CMake配置阶段可正常识别到对应版本OpenCV,暂未定位问题诱因。

#Search for dependencies
set(MIN_OPENCV_VERSION "3.4.11" CACHE STRING "OpenCV version")
find_package(OpenCV ${MIN_OPENCV_VERSION} REQUIRED
   COMPONENTS core
   PATHS /usr/local/opencv-${MIN_OPENCV_VERSION}
   NO_DEFAULT_PATH
)

补充排查操作:设置VERBOSE环境变量为1开启编译详细日志,拿到如下完整编译链接输出:

[ 90%] Building CXX object common/CMakeFiles/common.dir/src/utils/path_util.cpp.o
cd /home/user/ws/src/build/common && /usr/bin/c++   -I/usr/local/include/eigen3 -isystem /usr/local/opencv-3.4.11/include -isystem /usr/local/opencv-3.4.11/include/opencv -I/home/user/ws/src/common/include -I/home/user/ws/src/common/src -isystem /usr/local  -fPIC   -o CMakeFiles/common.dir/src/utils/path_util.cpp.o -c /home/user/ws/src/common/src/utils/path_util.cpp
[ 95%] Linking CXX executable road_info
/usr/bin/cmake -E cmake_link_script CMakeFiles/myproj.dir/link.txt --verbose=1
/usr/bin/c++    -rdynamic CMakeFiles/myproj.dir/main.cpp.o  -o myproj mainpub_lib/mainpub.a 
CMakeFiles/myproj.dir/main.cpp.o: In function `cv::String::~String()':
main.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
CMakeFiles/myproj.dir/main.cpp.o: In function `cv::String::operator=(cv::String const&)':
main.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()'
collect2: error: ld returned 1 exit status
CMakeFiles/myproj.dir/build.make:95: recipe for target 'myproj' failed
make[2]: *** [myproj] Error 1
make[2]: Leaving directory '/home/user/ws/src/build'
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/myproj.dir/all' failed
make[1]: *** [CMakeFiles/myproj.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
排查方向
  • 直接根因定位:从verbose输出的最终链接命令可以看到,链接myproj时执行的命令为/usr/bin/c++ -rdynamic CMakeFiles/myproj.dir/main.cpp.o -o myproj mainpub_lib/mainpub.a,命令中完全没有引入OpenCV的链接参数(既没有-lopencv_core这类库链接项,也没有指定OpenCV库文件搜索路径),属于典型的只做了find_package但未将依赖绑定到构建目标导致的符号找不到错误。
  • 检查目标链接配置:找到定义myproj可执行文件的CMakeLists.txt片段,在add_executable(myproj ...)语句后,添加OpenCV库链接配置:
    # 传统CMake变量写法
    target_link_libraries(myproj PRIVATE ${OpenCV_LIBS})
    # 现代CMake目标写法二选一即可
    # target_link_libraries(myproj PRIVATE opencv_core)
    
    注意:如果OpenCV是链接到你项目内的common等静态库上,静态库不会自动向上传递依赖给可执行目标,除非你在静态库的target_link_libraries配置中把OpenCV的属性设为PUBLIC,否则必须给最终的可执行目标显式链接OpenCV。
  • 确认cv::String引入来源:业务代码未显式使用cv::String不代表没有间接引入——只要你包含的头文件(不管是OpenCV自身头文件还是其他依赖OpenCV的第三方库头文件)中存在触发cv::String析构、赋值运算符生成的代码,编译阶段就会生成对应符号引用,必须在链接阶段提供对应实现。
  • 验证修复:修改CMake配置后,先清空build目录下的CMake缓存(删除CMakeCache.txt和CMakeFiles目录),重新执行cmake配置与编译,再次查看verbose链接输出,确认命令中已经包含OpenCV库的搜索路径和链接项,再验证报错是否消失。

内容的提问来源于stack exchange,提问作者KansaiRobot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:39:02