使用CMake构建OpenCV项目时出现cv::cvtColor未定义引用错误
解决CMake链接OpenCV时的未定义引用问题
从你给出的信息看,核心问题是CMake输出的OpenCV_LIBS是连在一起的字符串(比如opencv_calib3dopencv_core...),正常应该是空格分隔的独立库名列表。这导致链接器无法识别正确的库文件,所以出现大量undefined reference错误。
下面是具体的解决步骤:
1. 升级CMake版本
你当前用的CMake 2.8.3太老旧了,对OpenCV 4的支持很差。OpenCV 4要求CMake版本至少3.10以上,建议直接升级到3.16+的稳定版本。
2. 修改CMakeLists.txt,对齐g++的编译逻辑
既然g++用pkg-config opencv4能正常编译,那让CMake也用同样的方式获取OpenCV的配置信息,避免find_package的兼容性问题。修改后的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.10) project(Project) # 启用pkg-config模块,和你g++命令用的逻辑一致 find_package(PkgConfig REQUIRED) pkg_check_modules(OpenCV REQUIRED opencv4) add_executable(output src/EdgeDetector.cpp) # 设置C++14标准,和g++的-std=c++14对应 target_compile_features(output PRIVATE cxx_std_14) # 包含头文件:OpenCV的头目录 + 你的include目录 target_include_directories(output PRIVATE ${OpenCV_INCLUDE_DIRS} include) # 链接OpenCV库 target_link_libraries(output PRIVATE ${OpenCV_LIBRARIES}) # 打印验证库列表,现在应该是空格分隔的 MESSAGE("OpenCV_LIBRARIES: " ${OpenCV_LIBRARIES} )
3. 验证修复效果
删除原来的build目录,重新执行:
mkdir build && cd build cmake .. make
此时MESSAGE输出的OpenCV_LIBRARIES应该是类似opencv_core opencv_imgproc ...的空格分隔列表,链接错误会消失。
备选方案:不用pkg-config的修正
如果不想用pkg-config,确保CMake正确找到OpenCV 4的安装路径:
- 检查是否设置了
OpenCV_DIR环境变量,指向OpenCV安装目录下的lib/cmake/opencv4文件夹 - 修改find_package的写法,明确指定组件(比如你用到的imgproc、highgui等):
find_package(OpenCV 4 REQUIRED COMPONENTS core imgproc highgui imgcodecs)
这样OpenCV_LIBS会只包含你需要的库,且格式正确。
内容的提问来源于stack exchange,提问作者TimothyHeadhunter
相关产品推荐
相关产品推荐

