在 CMake 设置 OpenCV_STATIC 选项静态链接 OpenCV 库

介绍

OpenCV_STATIC是 OpenCV 在 Windows 独有的选项,用于控制是否静态链接 OpenCV 库。

CMakeLists.txt
1
set(OpenCV_STATIC ON)

在 Windows 本地手动用 CMake 构建安装的 OpenCV 库,无论使用的是 MSVC 还是 MinGW,得到的库的OpenCVConfig.cmake文件中都是有OpenCV_STATIC这个选项。而如果是用 vcpkg 安装的 OpenCV,那里面的OpenCVConfig.cmake文件中是没有OpenCV_STATIC选项的。

对于使用 MSVC 编译器工具链的项目,无论 OpenCV 是通过 vcpkg 安装的还是自己用 CMake 手动构建安装的,都是可以通过设置CMAKE_MSVC_RUNTIME_LIBRARY的值,来设置自己的项目整体是静态链接还是动态链接,不需要单独设置OpenCV_STATIC选项。

vcpkg 默认安装的是动态库版本。vcpkg 中的绝大多数库是有提供静态库版本的。像下面这样子,通过 Triplet 三元组,指定安装的库的目标平台和链接方式。

1
2
vcpkg install opencv4
vcpkg install opencv4:x64-windows-static

而如果项目使用的编译器是 MinGW,那么就需要用到OpenCV_STATIC选项了。而且,像那样写是没有问题的,同样是跨平台的。在其他系统没有这个选项,也就不会有实际影响。

以下是在安装目录下,OpenCVConfig.cmake中的内容。

OpenCVConfig.cmake
1
2
3
#    Windows pack specific options:
# - OpenCV_STATIC
# - OpenCV_CUDA
OpenCVConfig.cmake
1
2
3
4
5
6
7
8
if(NOT DEFINED OpenCV_STATIC)
# look for global setting
if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)
set(OpenCV_STATIC OFF)
else()
set(OpenCV_STATIC ON)
endif()
endif()

在 OpenCV 的 GitHub 仓库,cmake/templates目录,是 CMake 的模板文件。OpenCV_STATIC相关的内容就是在OpenCVConfig.root-WIN32.cmake.in文件中。

相关工作

个人感觉这个选项还是比较重要的。然而,网上很少有文章提到这个内容。

有个在 2010 年的提问,里面的回答是说到了OpenCV_STATIC,但那位题主是在 Linux 下运行的,没有也不需要用到这个选项,而是直接添加-static选项就行。

有的文章使用的是set(BUILD_SHARED_LIBS OFF)的方式。从之前给的内容来说,这样做的效果也确实是OpenCV_STATIC被设置为了ON。但是BUILD_SHARED_LIBS是一个全局选项,在现代 CMake 中不推荐这样直接写进去。而且这个选项一般是用于创建库的项目,一般不用于创建可执行文件的项目。


在 CMake 设置 OpenCV_STATIC 选项静态链接 OpenCV 库
https://sunboyallen.github.io/opencv-static/
作者
sunboyallen
发布于
2024年8月20日
许可协议