使用MSYS2 + MinGW64 编译 x264 过程
(创建32 bit 的 libx264-164.dll & libx264.a)
使用MSYS2 + MinGW64,gcc 编译 x264 源代码,创建 32bit 的 libx264-164.dll & libx264.a。
备注:如果希望不使用 Mingw-w64 gcc + nasm 编译 x264 ,而是用 Visual Studio 编译器去编译 x264 代码,可以参考
使用 VC + nasm 编译 X264 的案例:
用VisualStudio编译x264
l Windows10下安装MSYS2 + MingW-w64
利用msys2安装mingw-w64过程:
按照 https://www.msys2.org/ 的提示安装即可:下载并启动文件:msys2-x86_64-20210725.exe,开始安装。
为了提高下载&安装速度,需要网络上查找国内的代理网站,手工配置到C:\msys64\etc\pacman.d目录中的几个文件中。
在 MSYS2 MSYS(msys2_shell.cmd / msys2.exe)下安装各种工具:
pacman -S mingw-w64-x86_64-toolchain(不编译64bit程序 不需安装这个)
选择安装1,2,3,15
pacman -S mingw-w64-i686-toolchain
选择安装1,2,3,15
pacman -S base-devel
pacman -S nasm(nasm用于编译x264的汇编代码)。
安装完成之后,要注意msys2目录下有:
clang64.exe |
|
mingw32.exe |
用mingw-w64-i686-toolchain 编译。 |
mingw64.exe |
用mingw-w64-x86_64-toolchain编译。 |
msys2.exe |
|
ucrt64.exe |
|
注意:安装MSYS工具一定在MSYS2 MSYS(msys2_shell.cmd)窗口中进行。
查看gcc的版本
启动MSYS2 MinGW 64-bit ,在mingw64.exe窗口中查看gcc的版本。屏幕显示如下:
$ gcc -v
Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-10.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-lto --enable-libgomp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev5, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --with-boot-ldflags='-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc' 'LDFLAGS_FOR_TARGET=-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high' --enable-linker-plugin-flags='LDFLAGS=-static-libstdc++\ -static-libgcc\ -pipe\ -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high\ -Wl,--stack,12582912'
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.3.0 (Rev5, Built by MSYS2 project)
启动 MSYS2 MinGW 32-bit,在mingw32.exe窗口中看gcc的版本
$ gcc -v
Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-10.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-lto --enable-libgomp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev5, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --with-boot-ldflags='-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc' 'LDFLAGS_FOR_TARGET=-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high' --enable-linker-plugin-flags='LDFLAGS=-static-libstdc++\ -static-libgcc\ -pipe\ -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high\ -Wl,--stack,12582912'
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.3.0 (Rev5, Built by MSYS2 project)
查看nasm版本:
$ nasm -v
NASM version 2.15.05 compiled on Oct 24 2020
编译x264(32bit)
####下载最新的x264代码,
x264, the best H.264/AVC encoder - VideoLAN
https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
x264-master.tar.bz2
解压到home/john 目录下。
如果是编译64bit代码,启动 MSYS2 MinGW 64-bit
编译32bit代码,启动 MSYS2 MinGW 32-bit
####开始编译(32 bit)
在 MSYS2 mingw-w64 MinGW 32-bit 环境下
$ ./configure --host=i686-w64-mingw32 --enable-shared --extra-ldflags=-Wl,--output-def=libx264.def
platform: X86
byte order: little-endian
system: WINDOWS
cli: yes
libx264: internal
shared: yes
static: no
bashcompletion: no
asm: yes
interlaced: yes
avs: avisynth
lavf: no
ffms: no
mp4: no
gpl: yes
thread: win32
opencl: yes
filters: crop select_every
lto: no
debug: no
gprof: no
strip: no
PIC: no
bit depth: all
chroma format: all
You can run 'make' or 'make fprofiled' now.
$ make
dependency file generation...
windres --target=pe-i386 -I. -o x264res.o x264res.rc
gcc -Wno-maybe-uninitialized -Wshadow -O3 -ffast-math -m32 -Wall -I. -I. -D_POSIX_C_SOURCE=200112L -march=i686 -mfpmath=sse -msse -msse2 -std=gnu99 -D_GNU_SOURCE -mpreferred-stack-boundary=6 -fomit-frame-pointer -fno-tree-vectorize -fno-zero-initialized-in-bss -fvisibility=hidden -c x264.c -o x264.o
略
$ make install (可以省略这一步的)
$ ls -lt
-rwxr-xr-x 1 john john 3012773 Sep 29 00:31 libx264-164.dll
-rw-r--r-- 1 john john 1532 Sep 29 00:31 libx264.def
-rw-r--r-- 1 john john 34490 Sep 29 00:31 libx264.dll.a
-rwxr-xr-x 1 john john 3236994 Sep 29 00:31 x264.exe
-rw-r--r-- 1 john john 2951576 Sep 29 00:31 libx264.a
编译成功,3种使用X264的方法:
如果MSVC工程是非dll多任务工程,可以使用静态库 libx264.a ,方法是:
或在代码中添加 #pragma comment(lib, "libx264.a")
或在工程链接配置中,将 libx264.a 配置其中。
还需要复制几个个MSYS2(mingw-w64) 的静态库文件(32bit or 64 bit),并配置到工程中。
用 mingw-w64 编译出的 x264 静态库,如果用在 Viusal Studio MSVC 非 dll 多任务的项目中,可能(必然)会遇到静态库链接符号冲突问题,如何解决符合冲突问题,另文详述。
在 MSVC 项目中使用 x264 静态库,还可以直接使用 Visual Studio MSVC + nasm 编译 x264 代码,可以参考另一篇文章:
用Visual Studio 2022 & nasm 编译 x264
如果MSVC工程是 dll 多任务工程,需要用 x264 的动态库 dll 文件
第一种方法:
将语句
#pragma comment(lib, "libx264.dll.a")
添加到 MSVC 工程代码中,或在工程链接配置中,将 libx264.dll.a 配置其中。
并复制 libx264-164.dll,x264.h ,x264_config.h到工程要求的文件目录中(还需要2个MSYS2 mingw-w64 的32bit dll)
即可以在工程中使用 x264 的函数了。
使用dll第二种方法:可用于对旧的 libx264.dll 的升级,创建新 libx264.dll
先需要创建 dll 的 lib 文件。在 Viusual Studio 的命令窗口,使用VS提供的 lib.exe 工具
C:\msys64\home\john\x264-master>LIB /DEF:libx264.def
Microsoft (R) Library Manager Version 14.29.30133.0
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : warning LNK4068: 未指定 /MACHINE;默认设置为 X86
正在创建库 libx264.lib 和对象 libx264.exp
在 MSYS2 mingw-w64 MinGW 32-bit 窗口中:
$ ls -lt
-rw-r--r-- 1 john john 13106 Sep 29 00:38 libx264.lib
-rw-r--r-- 1 john john 7738 Sep 29 00:38 libx264.exp
-rwxr-xr-x 1 john john 3012773 Sep 29 00:31 libx264-164.dll
-rw-r--r-- 1 john john 1532 Sep 29 00:31 libx264.def
-rw-r--r-- 1 john john 34490 Sep 29 00:31 libx264.dll.a
-rw-r--r-- 1 john john 2951576 Sep 29 00:31 libx264.a
libx264-164.dll 文件名中的164 是当前编译的 x264 的版本号。
将libx264-164.dll 文件改名 libx264.dll ,和 libx264.lib 文件 x264.h ,x264_config.h 一并放置测试工程的相应目录,或修改、调整测试工程的环境参数,确保编译通过,编译测试工程编译通过后,执行中会发现还缺少如下dll文件(32bit):libgcc_s_dw2-1.dll,libwinpthread-1.dll。需要从MSYS2复制它们到测试工程的相应目录中。
附录测试代码:
1 #include <iostream>
2 #include <string>
3 #include "stdint.h"
4
5 #pragma comment(lib, "libx264.lib")
6
7 extern "C"
8 {
9 #include ".\x264.h"
10 #include "x264_config.h"
11 };
12
13 using namespace std;
14
15 int main()
16 {
17 std::cout << "Hello World!\n";
18 x264_param_t param;
19 x264_param_default(¶m);
20 cout << "hello,x264" << endl;
21 }
22
23