在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日
许可协议