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

删除两行代码为何引发ld“undefined reference”链接错误?

解决OpenCV项目删除imshow/waitKey后出现resize未定义引用的问题

这种问题其实挺常见的,本质是CMake自动链接的依赖模块发生了变化,我来帮你拆解原因和解决办法:

核心原因

你之前的代码里调用了cv::imshow和cv::waitKey,这两个函数属于OpenCV的highgui模块。CMake在配置阶段会扫描你的代码,自动检测到需要链接highgui,而highgui模块本身依赖imgproc(也就是cv::resize所属的模块),所以间接帮你把imgproc也链接进去了。

当你删除这两行代码后,CMake扫描不到对highgui的引用,就不会自动链接它,同时如果你的CMakeLists.txt里没有明确指定要链接imgproc,那resize函数的符号就找不到了,自然报出未定义引用错误。

具体解决步骤

1. 明确指定OpenCV依赖组件

打开你的CMakeLists.txt,找到find_package(OpenCV ...)这一行,把用到的模块明确列出来——比如你用到了core(基础模块)和imgproc(resize所在模块),如果还有其他依赖模块也一并加上:

find_package(OpenCV REQUIRED COMPONENTS core imgproc)

然后确保链接目标时正确引用OpenCV的库:

# 针对可执行文件
target_link_libraries(project_test PRIVATE ${OpenCV_LIBS})
# 如果是链接库的话
target_link_libraries(project PRIVATE ${OpenCV_LIBS})

2. 清理CMake缓存重新构建

有时候CMake会保留之前的缓存配置,导致新的依赖没被正确识别。执行以下命令清理后重新生成构建文件:

# 进入你的构建目录(比如build文件夹)
cd build
rm -rf CMakeCache.txt CMakeFiles/
cmake ..
make

3. 检查链接顺序(可选)

如果上面两步都没用,可能是链接顺序的问题。在CMake的target_link_libraries里,要把依赖的库放在被链接目标的后面,比如:

# 正确顺序:先写你的目标,再写依赖库
target_link_libraries(project_test project ${OpenCV_LIBS})

不要把OpenCV库放在项目库前面,否则链接器可能无法正确解析符号。

快速验证

你可以临时把cv::imshow那两行代码加回去,如果编译恢复正常,就说明确实是依赖模块没被正确链接的问题,按照上面的步骤调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:05:14