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的等工具。如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZ4oSVFh-1685881081122)(https://note.youdao.com/yws/api/personal/file/1C96C5F61C414C0B93C3B5296DCBE808?method=download&shareKey=a307692f1f87c2cd2e69940345d8575d)]

  1. 安装好后,在msys2下会分别有mingw32.exemingw64.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的库,这里有几点需要了解的:

  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.alibgcc.a都链接上,这个三个库在对应的64位或32位的mingw-w64安装目录中。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo4776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值