实战经验:在Windows平台编译x264

in #x2645 years ago (edited)

最近想研究一下大名鼎鼎的x264库,由于本人功力实在薄弱,单单是为了能在Windows平台编译这玩意,也花了不少功夫。在摸爬滚打的过程中,也碰到了一些坑,这里记录下来,希望能帮助有需要的朋友。

一. MSYS2配置
1 首先去MSYS2官网安装包,因为我的电脑是64位系统,所以,这里我选择x86_64版本。MSYS2可以根据需要安装32位和64位版本的mingw和编译工具链,而且还有个十分好用的包管理器:pacman,简直是谁用谁知道啊。
20190813_01.jpg

2 双击下载下来的安装包,然后,直接无脑下一步就好。
20190813_02.jpg
20190813_03.jpg
20190813_04.jpg

3 更新包数据块和系统核心包
20190813_05.jpg

4 更新其他包
20190813_06.jpg

5 分别安装32位版本和64位版本的工具链
20190813_07.jpg
20190813_08.jpg

6 安装软件组和其他工具

pacman -S base-devel

pacman -S vim

pacman -S nasm

pacman -S git

7 检查编译器是否正常

打开开始菜单的”MSYS2 64bit”,分别打开下面的“MSYS2 MinGW 32-bit”和”MSYS2 MinGW 64-bit”,执行gcc -v,看是否执行正常。特别是要看看gcc的编译平台是否对应。

二. x264编译
1 去VLC官网下载x264源码包并解压到msys64\home目录下。

2 工程配置

如果是编译32位版本的x264,请打开MSYS2 MinGW 32-bit,然后执行以下命令:

./configure –host=i686-w64-mingw32 –enable-shared –extra-ldflags=-Wl,–output-def=libx264.def

如果是编译64位版本的x264,请打开MSYS2 MinGW 64-bit,然后执行以下命令:

./configure –host=x86_64-w64-mingw32 –enable-shared –extra-ldflags=-Wl,–output-def=libx264.def

3 工程编译及安装

这就很简单了,两条指令搞定。

make

make install

4 编译完成

注意,编译成功后,会在x264的目录下生成如下几个文件:

libx264.a: Linux库,暂时不需要

libx264.def: 模块定义文件,后面会基于它来生成Windows下的Lib文件

libx264.dll.a: Linux库,暂时不需要

libx264-157.dll: 用于Windows的动态链接库

5 将DEF文件转换为Lib文件

打开Visual Studio的VC/Bin目录,下面有个lib工具可以用来生成Lib文件

32位版本Lib文件生成:

VC/Bin/Lib /DEF:libx264.def /machine:x86

64位版本Lib文件生成:

VC/Bin/amd64/Lib /DEF:libx264.def /machine:x64

三. 测试程序
至此,调用x264库的几个文件都已经成功生成了,可以编写一些简单的代码进行测试了。废话就不多说了,直接上代码:
20190813_09.jpg

注意包含相关头文件:
20190813_10.jpg

四. 碰到的坑
1 默认安装后,发现安装源连接速度太慢导致安装失败,可以修改如下文件,添加比较快的源。

msys64\etc\pacman.d\mirrorlist.msys:
20190813_11.jpg

msys64\etc\pacman.d\mirrorlist.mingw32:
20190813_12.jpg

msys64\etc\pacman.d\mirrorlist.mingw64:
20190813_13.jpg

2 生成的32位x264.dll,还依赖以下两个文件:

libgcc_s_dw2-1.dll

libwinpthread-1.dll

别担心,以上两个文件可以在这里找到:msys64\mingw32\bin

3 配置x264库时,可能会发生找不到C编译器的问题,可以按照以上步骤重新安装一下基础包和工具链,然后重试。

总结
好了,朋友们,可以愉快的玩耍了。

追求完美的朋友们,可以有32位和64位的版本了。

Coin Marketplace

STEEM 0.19
TRX 0.14
JST 0.030
BTC 64381.21
ETH 3475.67
USDT 1.00
SBD 2.50