介绍
本文主要是通过 CMake 进行优雅规范的操作,使用 MinGW 静态链接 OpenCV 库。本文给出的 CMake 命令和CMakeLists.txt
文件,能够很好地跨平台,跨编译器,并不局限于 MinGW 以及 OpenCV 库。这套操作规范,适用于在不同的平台进行各种库的构建和链接。这才是现代 CMake 该有的操作。
相关工作
网上关于使用 MinGW 静态链接 OpenCV 库的文章很少。这些文章的主要问题如下:
写法很不规范,过时丑陋。使用很多的麻烦操作,比如硬编码头文件和库文件路径,使用冗长的原生编译命令,手动链接特殊的动态库,等等。这些也是网上大部分关于使用 CMake 构建和链接库的文章的通病。明明都使用 CMake 来构建 OpenCV 库了,却不接着使用 CMake 进行操作。
有的文章在内容组织上,强绑定 IDE。明明几乎只是使用命令行的操作,却非要和具体的 C++ IDE 挂钩。
方法
首先还是通过 cmake-gui,生成 OpenCV 的构建文件。使用 cmake-gui 主要是为了方便修改那些编译选项。在构建 OpenCV 库之前,可以考虑把CMAKE_INSTALL_PREFIX
的值修改为C:/Program Files (x86)/OpenCV
,或者是安装之后再手动把install
文件夹放到C:/Program Files (x86)
下,并改名为OpenCV
。关于这点,我单独写了一篇内容具体介绍。
简单来说,实际上是 OpenCV 的这种设置,不符合现代 CMake 的规范,需要自行修改。
然后是构建和安装的操作。
1 | cmake --build . |
1 | cmake --install . |
接着,在自己的项目,当然也是用 CMake 构建。给出CMakeLists.txt
的示例写法。这样写是很规范的,完全是跨平台,跨编译器的。
1 | cmake_minimum_required(VERSION 3.15) |
可以看到,其中写了这么一句。
1 | set(OpenCV_STATIC ON) |
我同样是单独写为一篇内容来具体介绍。
简单来说,这个是 OpenCV 在 Windows 独有的选项。
以及写了这句。
1 | set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") |
这个是设置在使用 MSVC 时的静态链接。直接这样写就行,在其他编译器上会被忽略,也就不会有问题。
https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
接着就是在自己项目的build
目录下进行操作。还是那句话,都用 CMake 了,在构建自己的项目的时候,为什么还要手敲g++
那么一长串的命令,关于引用和链接的写法又长又丑陋。
1 | cmake -G "MinGW Makefiles" .. |
本文主要在说的是使用 MinGW 进行静态链接。实际上,使用其他的生成器,只要在相应的平台上,规范地安装了相应工具链构建的 OpenCV 库,操作是完全通用的。
1 | cmake --build . |
这样就能得到静态链接的可执行文件了,可以用objdump
确认其依赖。
总体来说,操作是很规范优雅的。
说些什么吧!