使用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.dllx264.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(&param);
20    cout << "hello,x264" << endl;
21 }
22 
23  

 

 

 

 

posted on 2021-10-02 17:36  johnphan  阅读(2227)  评论(0编辑  收藏  举报

导航