当前位置: 首页 > news >正文

[特殊字符] OpenCV opencv_world 模块作用及编译实践完整指南

📌 什么是 opencv_world 模块?

opencv_world 是 OpenCV 官方提供的一个 大型集成动态库。它将 OpenCV 所有启用的模块(例如 core, imgproc, highgui, videoio, dnn, photo 等)打包到一个单一的动态库文件(如 Linux 的 libopencv_world.so 或 Windows 的 opencv_world.dll)中。


🌟 opencv_world 的优势

简化链接配置
开发者只需链接一个库,而不是多个 OpenCV 模块库,简化了 Makefile / CMake 配置。

适合嵌入式或交叉编译
部署时只需关注一个大库文件,方便管理和发布。

减少动态链接器加载开销
加载一个大库比多个小库效率高,尤其在某些嵌入式系统或资源受限环境中效果明显。


opencv_world 的不足

库文件体积大
所有启用模块都打包进同一个库,即便你的应用只用到其中少部分功能,最终库文件体积依然较大。

缺乏灵活性
不像分模块库(libopencv_core.solibopencv_imgproc.so 等),无法按需部署或按需加载。

编译时不会生成单独模块 so 文件
启用 BUILD_opencv_world=ON 时,OpenCV 的构建系统默认不生成各个模块的独立库文件,只生成 libopencv_world.so


🛠 如何编译 OpenCV 生成 opencv_world

示例 CMake 配置:

 

bash

复制编辑

cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D BUILD_opencv_world=ON \ -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv_contrib-3.4.16/modules \ -D BUILD_EXAMPLES=ON \ ..

编译:

 

bash

复制编辑

make -j$(nproc) sudo make install

安装后,你会看到:

 

swift

复制编辑

/usr/local/lib/libopencv_world.so

此时 不会有

 

swift

复制编辑

/usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_imgproc.so ...


📝 如果想同时生成 opencv_world 和单独模块库怎么办?

官方 CMake 的设计:

BUILD_opencv_world=ON 时,只编译 world 库,不生成单独模块库。

要想两者都有,推荐:

🔑 编译两次 OpenCV

方法 1:先编单独模块,再编 opencv_world
 

bash

复制编辑

# 第一次:编译单独模块库 cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv_contrib-3.4.16/modules \ -D BUILD_opencv_world=OFF \ -D BUILD_EXAMPLES=OFF \ .. make -j$(nproc) sudo make install # 第二次:编译 opencv_world cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv_contrib-3.4.16/modules \ -D BUILD_opencv_world=ON \ -D BUILD_EXAMPLES=OFF \ .. make -j$(nproc) sudo make install

方法 2:先编 opencv_world 再编单独模块库

完全可行,效果一致。顺序不影响功能,最后一次安装会决定 pkg-config 默认指向哪个库。


安装顺序的影响

最后一次 make install 的构建结果会影响:

  • pkg-config --libs opencv 的输出

  • 默认链接的库(是 opencv_world 还是分模块库)

💡 检查当前默认库

 

bash

复制编辑

pkg-config --libs opencv


🌈 常见编译配置完整示例

 

bash

复制编辑

cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv_contrib-3.4.16/modules \ -D BUILD_opencv_world=ON \ -D BUILD_EXAMPLES=ON \ -D WITH_VTK=OFF \ -D BUILD_JAVA=OFF \ ..

如果不需要 VTK、Java 等功能,建议关闭,以减少编译依赖和体积。


💻 常见问题与解答

Q: 为什么编了 opencv_world 没有单独模块 so 文件?

因为 BUILD_opencv_world=ON 时,CMake 默认只构建 world 库,不生成单独模块。


Q: 可以同时生成 opencv_world 和单独模块库吗?

官方默认不支持一次生成,需要编译两次:
1️⃣ 一次编单独模块
2️⃣ 一次编 opencv_world
顺序无所谓。


Q: 能先编 opencv_world 再编单独模块吗?

✅ 可以!顺序不影响功能。


📝 一键双编译脚本示例

以下脚本演示了先编单独模块再编 opencv_world

 

bash

复制编辑

#!/bin/bash SRC_DIR=/home/pi/opencv-3.4.16 CONTRIB_DIR=/home/pi/opencv_contrib-3.4.16/modules # 编单独模块 rm -rf $SRC_DIR/build_modules mkdir $SRC_DIR/build_modules cd $SRC_DIR/build_modules cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=$CONTRIB_DIR \ -D BUILD_opencv_world=OFF \ -D BUILD_EXAMPLES=OFF \ .. make -j$(nproc) sudo make install # 编 opencv_world rm -rf $SRC_DIR/build_world mkdir $SRC_DIR/build_world cd $SRC_DIR/build_world cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=$CONTRIB_DIR \ -D BUILD_opencv_world=ON \ -D BUILD_EXAMPLES=OFF \ .. make -j$(nproc) sudo make install

可以按需调整顺序或参数。


🏁 结论

opencv_world 适合简化部署,特别是嵌入式或交叉编译环境。
✅ 想同时拥有 opencv_world 和单独模块库时,需编译两次,顺序随意。
✅ 最终安装顺序会影响默认链接配置,需要留意。


如果需要,我可以:
👉 为你的环境生成完整脚本
👉 帮你定制 CMake 配置或 pkg-config 文件

只需告诉我你的目标需求! 🚀

http://www.lqws.cn/news/491041.html

相关文章:

  • 软件设计模式期末复习模拟解析
  • 运维打铁: Windows 服务器基础运维要点解析
  • arcgis分割 (Split)
  • 目标检测之YOLOv5到YOLOv11——从架构设计和损失函数的变化分析
  • 微信小程序:选择页面单选实现(多页面均可选择)
  • 黑马React001
  • 用Tensorflow进行线性回归和逻辑回归(三)
  • 【论文阅读35】-PINN review(2021)
  • Docker快速部署可视化防火墙工具:使用go语言开发,底层是iptables,提供API调用
  • Vue 列表过滤:语法与注意事项详解
  • 四核 A53+工业级存储:移远 SC200L 与 pSLC SD NAND 如何重构 T-BOX 性能边界?
  • 波动方程解法及反射波讨论
  • AI智能体:从功能封装到自主决策的进化之路
  • 副驾屏高斯模糊/Kawase方案---无wallpaper,透明区域如何实现高斯模糊/Kawase效果(卷2: 副驾屏Kawase 模糊实现方案)
  • BUUCTF [UTCTF2020]File Carving 1
  • JVM线上调试
  • 免费生成 吉卜力 风格头像
  • libwebsockets编译
  • Firewalld服务
  • 虚拟 DOM 与 Diff 算法:现代前端框架的核心机制
  • 2025 年前端框架的深度解析与展望
  • Vue实现选中多张图片一起拖拽功能
  • 时序数据库IoTDB数据导入与查询功能详解
  • 实战 + 原理全解析:用 Qwen-Agent 构建图文生成智能体!
  • 笔试强训:Day8
  • EukDetect:基因标记基因的真核微生物注释
  • Java 期末考试题
  • 阿里云MCP:开启AI应用新时代
  • 突破中文知识处理瓶颈:基于 ChatGLM-6B + LangChain 的本地化智能问答系统实战
  • 什么是Sentinel? 以及优点