Ubuntu 16环境下简单OpenCV C++程序编译运行出现大量错误的求助
嘿,作为OpenCV新手遇到这种一堆错误的情况确实头大,不过咱们从你的代码和配置里能找到几个典型的新手坑,一步步修正就能解决:
1. 先把混乱的CMakeLists.txt理清楚
你的CMake配置里重复写了cmake_minimum_required和project,版本要求前后不一致,项目名也重复定义,这会让CMake直接混乱。改成下面干净的版本:
cmake_minimum_required(VERSION 3.5) project(openCVTest) # 查找系统安装的OpenCV库 find_package(OpenCV REQUIRED) # 打印OpenCV信息(可选,方便你确认是否找到正确的库) message(STATUS "OpenCV版本: ${OpenCV_VERSION}") message(STATUS "OpenCV头文件路径: ${OpenCV_INCLUDE_DIRS}") message(STATUS "OpenCV链接库: ${OpenCV_LIBS}") # 生成可执行文件 add_executable(openCVTest opencv.cpp) # 把OpenCV库链接到你的程序上 target_link_libraries(openCVTest ${OpenCV_LIBS})
这里去掉了冗余的重复配置,CMake 2.8.11+(Ubuntu16的版本肯定满足)会自动处理OpenCV的头文件路径,不用手动加include_directories。
2. 修正C++代码的头文件冲突
你代码里同时包含了标准OpenCV头文件和一个绝对路径的/usr/local/include/opencv4/...,但你是用sudo apt install libopencv-dev装的库,头文件路径应该是/usr/include/opencv2/,不是/usr/local(那是源码编译安装的路径),不同路径的头文件混在一起会导致大量冲突错误。改成下面的代码:
#include <iostream> #include <opencv2/opencv.hpp> // 这一个头文件就够了,包含所有核心模块 using namespace std; using namespace cv; int main() { // 注意路径要确保正确,建议先确认图片存在 Mat image = imread("/home/c++/edge detection/DisplayImage.JPG", IMREAD_COLOR); if (image.empty()) { // 一定要加这个判断!避免空指针崩溃 cout << "无法读取图片!检查路径是否正确" << endl; return -1; } imshow("DisplayImage", image); waitKey(0); // 必须加这个,否则窗口会一闪而过直接关闭 return 0; }
这里做了几个优化:
- 去掉冗余头文件,
opencv2/opencv.hpp已经包含了imgcodecs、highgui等模块 - 把硬编码的
1换成可读性更高的IMREAD_COLOR - 添加图片读取失败的判断,这是新手最容易忽略的点
- 加上
waitKey(0),保证窗口能停留直到你按任意键
3. 检查32位/64位库的兼容性
从你pkg-config opencv --libs的输出看,库路径是/usr/lib/i386-linux-gnu/,这是32位的库。如果你的Ubuntu16是64位系统,就会出现编译链接不兼容的问题。先确认你的系统架构:
uname -m
如果输出是x86_64,说明是64位系统,安装64位的OpenCV库:
sudo apt install libopencv-dev:amd64
再运行pkg-config opencv --libs,应该会显示/usr/lib/x86_64-linux-gnu/开头的路径,这就对了。
4. 正确的编译运行步骤
改完上面的文件后,按下面的步骤操作(推荐用out-of-source编译,避免污染源码):
- 新建编译目录并进入:
mkdir build && cd build
- 用CMake生成Makefile:
cmake ..
- 编译程序:
make
- 运行程序:
./openCVTest
为什么会出现大量错误?
总结下来就是三个核心问题:
- CMake配置重复定义导致逻辑混乱
- 头文件路径冲突(同时混用apt安装和源码安装的路径)
- 可能存在32位/64位库不兼容的情况
按照上面的步骤改完,应该就能正常编译运行了!
内容的提问来源于stack exchange,提问作者12081

