windows下编译x264库

背景

首先说一下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,这种方式最简单。

  1. 在msys2的安装目录下,运行msys2.exe
  2. 通过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的等工具。如下图:

windows下编译x264库_第1张图片

  1. 安装好后,在msys2下会分别有mingw32.exemingw64.exe两个执行环境,如下图:

windows下编译x264库_第2张图片

编译

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结果如下:

windows下编译x264库_第3张图片

红框标识的需要注意下,分别表示:64位,关闭命令行模式,汇编开启,再直接make即可

编译32位静态流程一样,通过mingw32.exe启动32位环境,安装nasm,使用如下configure配置:

./configure --host=i686-w64-mingw32 --enable-static --disable-cli

参数如下配置,同样注意下需要的配置项。再make即可。

windows下编译x264库_第4张图片

注意: 在configure的过程中可能会报错,这时可以查看下config.log的具体报错信息,做相应修改即可。

库的使用

这里编译出来的libx264.a是需要使用MSVC来链接到目标程序的,关于MSVC如何使用mingw的库,这里有几点需要了解的:

  1. 编译出来的静态库是以.a结尾的,如果编译的是动态库,则得到:libxxx.dll.a,libxxx.dll。.dll.a是动态的导出库,libxxx.dll是在程序运行中所需要的。这个跟MSVC的机制是一样的
  2. libxxx.a这种类型的 C++ 库是没有办法使用的,因为 MSVC 使用静态库格式是 libxxx.lib。 .a 和 .lib 格式的C++库内部结构不一样,直接使用会报错说格式不对。
  3. libxxx.dll这种类型的动态库也没有办法直接使用。MinGW使用GCC编译器,而MSVC使用的是微软的编译器 CL。这两种方式对于C++的name mangling的实现方式不一样。所以没有办法直接在MSVC上使用MinGW 编译的库文件。
  4. 对C的名称是可以不进行name mangling的,所以为了能够使得 MSVC能够使用MinGW编译的C++库,需要给库添加一层C接口,并给这些C接口加上: extern “C”。
    参考

x264提供的接口已经添加了extern "C"所以这个静态库可以直接使用。在链接目标程序时,可能会报mingw中的某个函数找不到定义,所以需要将libmingw32.a
libmingwex.alibmingwthrd.a都链接上,这个三个库在对应的64位或32位的mingw-w64安装目录中。

你可能感兴趣的:(音视频开发)