背景
首先说一下mingw和msys是干啥的,mingw本质上一个开发工具链,它提供了针对win32应用的GNU工具链,以及对等于windows SDK的头文件和用于MinGW版本链接的库文件(so,a等,而不是msvc的dll,lib),所以如果程序只用到C/C++标准库,而不用到POSIX API,是可以用MinGW在windows环境下编译的,编译出来的静态库,动态库是可链接的,并且可以通过msvc来链接的。所以就跟原生的windows程序一样,只是编译的工具不同。
msys是提供一个除了开发工具链以外的类Unix环境,就是模拟了Unix的目录结构和shell环境。
msys2和MinGW-W64可以理解为msys和mingw的升级版。
下面我要编译的x264,现在已经不提供msvc的编译配置,而是提供的GCC的编译配置,而的代码本身是可以在window下编译的,所以直接使用MinGW来编译是最方便的。我要编译出64位版本和32位版本的x264静态库,而mingw只是提供32位环境,所以我选择通过ming-w64+msys2作为编译环境。
安装msys2和MinGW-W64
我们先安装msys2,安装比较简单直接下一步下一步就好了。通过msys2的pcaman包管理工具来安装MinGW-W64,这种方式最简单。
- 在msys2的安装目录下,运行msys2.exe
- 通过pacman命令来安装MinGW-W64,MinGW-W64本身有两个版本:mingw-w64-x86_64
和mingw-w64-i686,一个是64位,一个是32位。
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-i686-toolchain
通过上面两个命令分别安装64位工具链的和32位的工具链,工具链中已经包含了gcc,g++,gdb,make的等工具。如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZ4oSVFh-1685881081122)(https://note.youdao.com/yws/api/personal/file/1C96C5F61C414C0B93C3B5296DCBE808?method=download&shareKey=a307692f1f87c2cd2e69940345d8575d)]
- 安装好后,在msys2下会分别有mingw32.exe和mingw64.exe两个执行环境,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zVBLwvyS-1685881081123)(https://note.youdao.com/yws/api/personal/file/3923485B909F42EBA600413A08682749?method=download&shareKey=be404fc15dcb43edf2d06df8b5758efa)]
编译
x264的编译需要注意一定要配置打开汇编,因为x264对一些常见的CPU架构做了汇编优化,如果不配置使用汇编,编码性能会大大的降低。
针对windows的x86平台,先安装nasm,下面演示64位版本,通过mingw64.exe启动64位环境,安装nasm,通过如下命令:
pacman -S nasm
进入x264源码目录,通过configure配置编译选项,如下:
./configure --host=x86_64-w64-mingw32 --enable-static --disable-cli
configure结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L7qmBfds-1685881081123)(https://note.youdao.com/yws/api/personal/file/EC8D3B238AC743E38B823274B224F340?method=download&shareKey=6b250987c90d878060c4cbe3a71b02b1)]
红框标识的需要注意下,分别表示:64位,关闭命令行模式,汇编开启,再直接make即可
编译32位静态流程一样,通过mingw32.exe启动32位环境,安装nasm,使用如下configure配置:
./configure --host=i686-w64-mingw32 --enable-static --disable-cli
参数如下配置,同样注意下需要的配置项。再make即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NnNIomm6-1685881081124)(https://note.youdao.com/yws/api/personal/file/2EAB8EF0F9A24BCB9719DD2B5B8C0930?method=download&shareKey=35f6357fcc07590b27cc135f0212cb86)]
注意: 在configure的过程中可能会报错,这时可以查看下config.log的具体报错信息,做相应修改即可。
库的使用
这里编译出来的libx264.a是需要使用MSVC来链接到目标程序的,关于MSVC如何使用mingw的库,这里有几点需要了解的:
- 编译出来的静态库是以.a结尾的,如果编译的是动态库,则得到:libxxx.dll.a,libxxx.dll。.dll.a是动态的导出库,libxxx.dll是在程序运行中所需要的。这个跟MSVC的机制是一样的
- libxxx.a这种类型的 C++ 库是没有办法使用的,因为 MSVC 使用静态库格式是 libxxx.lib。 .a 和 .lib 格式的C++库内部结构不一样,直接使用会报错说格式不对。
- libxxx.dll这种类型的动态库也没有办法直接使用。MinGW使用GCC编译器,而MSVC使用的是微软的编译器 CL。这两种方式对于C++的name mangling的实现方式不一样。所以没有办法直接在MSVC上使用MinGW 编译的库文件。
- 对C的名称是可以不进行name mangling的,所以为了能够使得 MSVC能够使用MinGW编译的C++库,需要给库添加一层C接口,并给这些C接口加上: extern “C”。
参考
x264提供的接口已经添加了extern "C"所以这个静态库可以直接使用。在链接目标程序时,可能会报mingw中的某个函数找不到定义,所以需要将libmingw32.a,
libmingwex.a,libmingwthrd.a,libgcc.a都链接上,这个三个库在对应的64位或32位的mingw-w64安装目录中。