资讯动态

OpenCV 4.5.5 源码编译与 C++ 项目环境搭建实战

发布时间:2026/10/17 16:18:19 来源:尧图企业网站定制
简介OpenCV 4.5.5 预编译动态库面向 C 图像处理与计算机视觉开发者尤其适合不想在 Windows 环境下从源码编译、希望开箱即用的中初级工程师与在校学生。包内共 619 个文件以 485 个 hpp 与 56 个 h 头文件为主体配合 5 个 dll、4 个 lib 及 14 个 exe 可执行程序另含 22 个 xml 配置、5 个 cmake 构建脚本与若干开源许可证说明压缩包约 72.8MB覆盖 opencv_world 主库、videoio_ffmpeg 视频编解码等核心模块。已有 2210 人学习下载可直接将头文件与库文件接入 Visual Studio 工程省去 CMake 编译与依赖配置环节快速验证图像读写、特征检测、视频流处理等算法也便于对照目录结构理解 OpenCV 模块划分与第三方依赖关系。1. OpenCV 4.5.5 环境搭建从源码编译到 C 项目跑通装 OpenCV 这件事说简单也简单apt install一行命令就能糊弄过去说坑也真坑尤其是你要在 C 项目里用上 4.5.5 这个特定版本系统源里往往只有 4.2 或者 4.6版本对不上编译到一半报undefined reference是常有的事。我见过太多人卡在pkg-config --modversion opencv4输出一个不对的版本号上然后开始怀疑人生。这篇笔记记录的是我最近一次在 Linux 环境下从源码编译 OpenCV 4.5.5 并让一个 C Demo 跑通的完整过程包括依赖怎么装、CMake 参数怎么取舍、装完怎么验证、翻车了怎么救。如果你正在找一个能复现的 OpenCV 4.5.5 安装方案照着走应该能省下不少查 issue 的时间。2. 装前准备依赖清单与版本选择2.1 为什么选 4.5.5 而不是系统源里的版本OpenCV 4.5.5 是 2021 年底发布的一个长期被引用的版本很多视觉项目、教学代码和第三方库的 CMake 配置里写死了find_package(OpenCV 4.5 REQUIRED)。系统源里的 OpenCV 版本取决于发行版比如 Ubuntu 20.04 默认是 4.2Ubuntu 22.04 是 4.5.4差一个小版本就可能缺某些 API 或者模块。更关键的是源码编译能让你控制BUILD_opencv_world、WITH_CUDA、OPENCV_GENERATE_PKGCONFIG这些开关而包管理器装出来的版本往往把 contrib 模块和 pkg-config 文件拆得七零八落。我一般会先确认三件事编译器版本、CMake 版本、以及是否需要 contrib 模块。OpenCV 4.5.5 要求 CMake 不低于 3.5.1GCC 不低于 5.4实际用 GCC 9 或 11 都没问题。如果你要用 SIFT、SURF 这类专利期已过的特征4.5.5 主仓库已经包含不需要额外 contrib但如果你要用aruco、face、tracking这些就得把 opencv_contrib 一起拉下来版本号必须和主仓库严格一致都是 4.5.5。2.2 依赖安装一条命令补齐但别照抄依赖这块官方文档给了一长串但实际编译时真正卡人的就那么几个libgtk-3-dev影响 highgui 窗口显示libavcodec-dev系列影响视频读写libtbb-dev影响并行加速。下面这条命令是我在 Debian/Ubuntu 系上常用的但注意libjasper-dev在较新发行版里已经移除如果报错就把它删掉。# 基础编译工具链 sudo apt update sudo apt install -y build-essential cmake git pkg-config # 图像与视频编解码依赖 sudo apt install -y libjpeg-dev libpng-dev libtiff-dev sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt install -y libxvidcore-dev libx264-dev # GUI 与并行计算依赖 sudo apt install -y libgtk-3-dev libtbb2 libtbb-dev # Python 绑定相关即使只写 C 也建议装方便验证 sudo apt install -y python3-dev python3-numpy # 可选优化依赖 sudo apt install -y libatlas-base-dev gfortran这段命令的逻辑是分层的第一层保证你能编译第二层保证imread、VideoCapture这些函数不会因为缺编解码库而返回空第三层保证imshow能弹出窗口、parallel_for_能跑起来。libtbb2在 Ubuntu 22.04 上可能已经改名成libtbb12如果 apt 找不到就换成libtbb-dev单独装。我一般会先跑一遍apt install把报错的包名记下来再去搜对应的替代包而不是一次性把网上抄来的长列表全塞进去。提示如果你在容器里编译libgtk-3-dev会拖进来一堆 X11 相关依赖镜像体积会涨不少。如果不需要 GUI可以在 CMake 里把WITH_GTK设为 OFF但这样imshow就用不了。2.3 源码下载与目录规划OpenCV 4.5.5 的源码包在 GitHub 上以 tag 形式存在直接 clone 指定分支最稳妥。我习惯把源码放在~/opencv-build下主仓库和 contrib 平级编译目录单独建这样删起来干净。mkdir -p ~/opencv-build cd ~/opencv-build # 拉取主仓库 4.5.5 分支 git clone --branch 4.5.5 --depth 1 https://github.com/opencv/opencv.git # 如果需要 contrib 模块一并拉取同版本 git clone --branch 4.5.5 --depth 1 https://github.com/opencv/opencv_contrib.git--depth 1表示只拉最近一次提交能省不少下载时间代价是没法切到其他 tag。如果你后续想换版本得重新 clone。目录结构应该是opencv-build/opencv和opencv-build/opencv_contrib两个文件夹。contrib 模块的路径在 CMake 里要用绝对路径指定后面会讲。3. CMake 配置与编译参数取舍与踩坑记录3.1 CMake 关键参数逐个说清进入opencv目录建一个build子目录然后跑cmake。下面这条命令是我在只写 C、不需要 CUDA、需要 pkg-config 的场景下常用的配置cd ~/opencv-build/opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_EXTRA_MODULES_PATH~/opencv-build/opencv_contrib/modules \ -D OPENCV_GENERATE_PKGCONFIGON \ -D BUILD_EXAMPLESOFF \ -D BUILD_opencv_python3ON \ -D WITH_CUDAOFF \ -D WITH_GTKON \ -D INSTALL_C_EXAMPLESOFF \ -D INSTALL_PYTHON_EXAMPLESOFF \ ..逐条解释CMAKE_BUILD_TYPERELEASE开优化别用 Debug否则跑起来慢得怀疑人生CMAKE_INSTALL_PREFIX/usr/local是默认安装路径装完头文件在/usr/local/include/opencv4库在/usr/local/libOPENCV_EXTRA_MODULES_PATH指向 contrib 的modules目录不写这行就不编译 contribOPENCV_GENERATE_PKGCONFIGON会生成opencv4.pc这是后面pkg-config能找到 OpenCV 的关键很多教程漏了这行导致编译 C 项目时pkg-config --cflags opencv4报错BUILD_opencv_python3ON顺手把 Python 绑定编了方便用cv2.__version__快速验证版本WITH_CUDAOFF是因为我没装 CUDA如果你有 NVIDIA 显卡且装了 CUDA可以设为 ON但编译时间会从十几分钟涨到一两个小时。注意OPENCV_EXTRA_MODULES_PATH必须用绝对路径用相对路径在build目录里会找不到。另外 contrib 里有些模块依赖boost或protobuf如果 cmake 报缺依赖要么补装要么在参数里把对应模块关掉比如-D BUILD_opencv_sfmOFF。3.2 编译与安装线程数和内存的平衡配置完成后cmake输出里会有一张表列出各个模块的编译状态。重点看To be built里有没有你需要的模块以及Python 3那行是不是YES。确认无误后开始编译# 查看 CPU 核心数决定 -j 后面的数字 nproc # 假设输出是 8就用 -j8内存小于 8GB 建议 -j4 make -j8 # 编译完成后安装到 /usr/local sudo make install # 更新动态链接库缓存 sudo ldconfigmake -j8里的数字不是越大越好。OpenCV 编译时单个源文件可能吃掉 1GB 以上内存如果你在虚拟机或小内存云主机上跑-j$(nproc)很容易触发 OOM Killer表现为make进程突然被 killed终端只留下一行Killed。我一般会先看free -h可用内存除以 1.5 再取整作为-j的上限。sudo make install会把头文件、库文件、pkg-config 文件分别拷到/usr/local下对应目录。sudo ldconfig是刷新/etc/ld.so.cache不跑这步的话运行程序时可能报error while loading shared libraries: libopencv_core.so.4.5。3.3 环境变量与 pkg-config 配置装完之后pkg-config默认会在/usr/local/lib/pkgconfig里找.pc文件但有些系统这个路径不在默认搜索范围内。先验证一下pkg-config --modversion opencv4如果输出4.5.5说明配置正确。如果报Package opencv4 was not found先确认/usr/local/lib/pkgconfig/opencv4.pc是否存在。如果存在把路径加进PKG_CONFIG_PATH# 临时生效 export PKG_CONFIG_PATH/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH # 永久生效写入 ~/.bashrc echo export PKG_CONFIG_PATH/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH ~/.bashrc source ~/.bashrc另外动态库路径也需要确认。/usr/local/lib通常在/etc/ld.so.conf.d/里已经有配置但如果你装到了自定义路径就得手动加一个 conf 文件。我一般会跑ldconfig -p | grep opencv看看库有没有被识别到。这一步不做后面编译 C 项目时链接阶段就会报找不到-lopencv_core。4. 避坑与排查五个真实翻车现场4.1 现象cmake 卡在 “ICV: Downloading ippicv_2020_lnx_intel64_20191018_general.tgz”原因OpenCV 编译时会从第三方地址下载 IPPICV 等预编译二进制包网络不通时就一直卡着最后超时失败。解决提前把相关包下载好放到指定目录或者直接在 cmake 里关掉 IPP。我一般用后者因为 IPP 对普通 C 项目加速有限cmake -D WITH_IPPOFF ...如果不想关可以手动下载后放到opencv/.cache/ippicv/下文件名要跟 cmake 期望的一致具体文件名在opencv/3rdparty/ippicv/ippicv.cmake里能看到。4.2 现象make 到 99% 报 “virtual memory exhausted: Cannot allocate memory”原因编译某个大文件时内存不够常见于opencv_dnn或opencv_core的某些源文件。解决降低并行度把-j8改成-j2甚至-j1或者临时加 swap。我一般会先sudo fallocate -l 4G /swapfile sudo mkswap /swapfile sudo swapon /swapfile顶一下编译完再关掉。4.3 现象编译自己的 C 项目时fatal error: opencv2/opencv.hpp: No such file or directory原因头文件路径没给对。OpenCV 4.x 的头文件装在/usr/local/include/opencv4/opencv2/下而不是/usr/local/include/opencv2/。解决编译时加-I/usr/local/include/opencv4或者用pkg-config --cflags opencv4自动获取。用 CMake 的话find_package(OpenCV REQUIRED)之后include_directories(${OpenCV_INCLUDE_DIRS})会自动处理。4.4 现象运行程序时报error while loading shared libraries: libopencv_core.so.4.5原因动态链接器找不到/usr/local/lib下的库ldconfig没跑或者路径没进缓存。解决先sudo ldconfig再ldconfig -p | grep opencv确认。如果还不行检查/etc/ld.so.conf.d/下有没有包含/usr/local/lib的配置文件没有就手动加一个echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/opencv.conf sudo ldconfig4.5 现象pkg-config --modversion opencv4输出 4.2 而不是 4.5.5原因系统里同时存在包管理器装的 OpenCV 和源码编译的 OpenCVpkg-config优先找到了旧版本的.pc文件。解决用pkg-config --variableprefix opencv4看它实际指向哪个路径。如果是/usr说明找到的是系统包。把/usr/local/lib/pkgconfig在PKG_CONFIG_PATH里放到最前面或者干脆把系统包卸掉。我一般会在源码编译前先sudo apt remove libopencv-dev避免版本打架。5. 验证跑通一个最小 C Demo 和版本确认技巧装完不验证等于没装。我习惯用两个动作确认先看版本号再跑一个读写图片的最小 Demo。先确认版本pkg-config --modversion opencv4 # 期望输出4.5.5 python3 -c import cv2; print(cv2.__version__) # 期望输出4.5.5如果 Python 那行报ModuleNotFoundError说明 Python 绑定没编进去回到 cmake 那步检查BUILD_opencv_python3是否为 ON以及PYTHON3_EXECUTABLE是否指向正确的 python3。然后写一个最小 C 程序功能是读一张图片、转灰度、写出来。这个 Demo 能同时验证 core、imgproc、imgcodecs 三个模块。// demo.cpp #include opencv2/opencv.hpp #include iostream int main() { // 读取图片路径换成你本地实际存在的图片 cv::Mat img cv::imread(test.jpg); if (img.empty()) { std::cerr 无法读取图片请检查路径 std::endl; return -1; } cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); cv::imwrite(test_gray.jpg, gray); std::cout OpenCV 版本: CV_VERSION std::endl; std::cout 灰度图已保存 std::endl; return 0; }编译命令用pkg-config自动拼参数g demo.cpp -o demo $(pkg-config --cflags --libs opencv4) ./demopkg-config --cflags给出头文件路径--libs给出链接库列表这样就不用手动写一长串-lopencv_core -lopencv_imgproc。运行后如果输出OpenCV 版本: 4.5.5并且当前目录多了test_gray.jpg说明整套环境跑通了。如果编译时报undefined reference to cv::imread八成是pkg-config找到的还是旧版本回到 4.5 节排查。用 CMake 的项目可以写一个最简单的CMakeLists.txtcmake_minimum_required(VERSION 3.5) project(OpenCVDemo) find_package(OpenCV 4.5 REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(demo demo.cpp) target_link_libraries(demo ${OpenCV_LIBS})find_package(OpenCV 4.5 REQUIRED)里的4.5是最低版本要求写4.5.5也可以但有些 CMake 版本对补丁号匹配比较严格写4.5更稳。配置时如果报Could NOT find OpenCV检查OpenCV_DIR是否指向/usr/local/lib/cmake/opencv4这个目录是make install时生成的。从那以后我每次装完 OpenCV都会强制走一遍「pkg-config 看版本 → 编译最小 Demo → 运行看输出」这三步不看到CV_VERSION打印出目标版本号绝不往下写业务代码。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑