在 CMake 设置 OpenCV_STATIC 选项静态链接 OpenCV 库
介绍
OpenCV_STATIC是 OpenCV 在 Windows 独有的选项,用于控制是否静态链接 OpenCV 库。
1 | |
在 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 | |
而如果项目使用的编译器是 MinGW,那么就需要用到OpenCV_STATIC选项了。而且,像那样写是没有问题的,同样是跨平台的。在其他系统没有这个选项,也就不会有实际影响。
以下是在安装目录下,OpenCVConfig.cmake中的内容。
1 | |
1 | |
在 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 中不推荐这样直接写进去。而且这个选项一般是用于创建库的项目,一般不用于创建可执行文件的项目。