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库链接配置:
注意:如果OpenCV是链接到你项目内的common等静态库上,静态库不会自动向上传递依赖给可执行目标,除非你在静态库的# 传统CMake变量写法 target_link_libraries(myproj PRIVATE ${OpenCV_LIBS}) # 现代CMake目标写法二选一即可 # target_link_libraries(myproj PRIVATE opencv_core)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
相关产品推荐
相关产品推荐

