vs+msys2+yasm 编译libx264+ffmpeg详细解释(32位或64位)

下载msys2

1、到这里下载:
  http://msys2.github.io. 选择第二个:msys2-x86_64-20160921.exe
  下载后,安装默认安装到C:\ msys64
2.安装后,到msys2窗口执行,将C:\msys64\usr\bin加入环境变量。安装编译程序: pacman -S make gcc diffutils
3. 重命名C:\msys64\usr\bin\link.exe 为C: \msys64\usr\bin\link.bak, 避免和MSVC 的link.exe抵触。
4. 下载32位gcc (可以不用做,如果你是想编译.a的32位静态库的话需要这一步)
pacman -Ss gcc 命令搜索,找到mingw32/ 开头的包,这个是32位gcc。
pacman -S mingw-w64-i686-gcc 7.3.0-2 安装32位gcc(具体情况需要看你Ss搜索出来的结构)

注:msys是一个windows下模拟unix系统的工具,里面带有了gcc编译器以及linux下的头文件。pacaman是这个系统的包管理工具。运行msys2_shell.cmd模拟unix终端。通过这个工具,可以编译安装linux系统下的软件包。

下载yasm

  1. YASM下载地址:http://yasm.tortall.net/Download.html,下载其64位版本Win64 .exe (64 位 Windows 通用)。
      2、下载后,将下载回来的yasm-1.3.0-win64.exe 改名为yasm.exe,并放置于 MSYS2 安装目录中。就是放置到c:\msys64\usr\bin\ 中。

安装libx264

如果你平时用gcc进行开发的话,需要编译.a的静态库或者.dll的动态库。如果用msvc开发的话需要.lib静态库或者.dll动态库

gcc 编译libx264 (.a .dll)

1.下载libx264源码
git clone git://git.videolan.org/x264.git
2.开一个普通的终端(cmd.exe),转到C:\msys64目录下,运行 msys2_shell.cmd -mingw32 ,关闭旧的cmd.exe,使用新开出来的unix终端
3.转到libx264源码的位置,运行命令
·./configure --disable-cli --enable-shared --disable-win32thread --disable-thread --extra-ldflags=-Wl,--output-def=libx264.def --host=mingw32 --disable-asm --enable-static
–disable-win32thread –disable-thread 是因为windows下msys2有线程包没有弄好,干脆禁用,参考https://blog.csdn.net/jacke121/article/details/80342237
–host 指定编译器,如果编译64位改为mingw64即可
其他的选项百度查一下什么含有
4. make
5. make install
bin inclue lib 会被复制到/usr/local/ 下
6. 通过生成.lib文件
lib /machine:i386 /def:libx264.def
如果想生成64位的.lib,则把/machine去掉,默认64位。注意这个.lib没有任何的内容,它只是提供一个函数的索引,可以在vs工程中使用这个.lib(#pragma comment(lib, "libx264.lib"),编译通过后,程序运行时必须依赖.dll文件。

msvc编译libx264(.lib .dll)

  1. 打开x86 Native Tools Command Prompt for VS 2017

    如果想编译出64位的.lib 或者 .dll , 需要打开x64,后面无需改变。
  2. 在这个终端下,同样cd到C:/msys2_64, 然后运行msys2_shell.cmd 打开一个新的unix终端,然后使用这个新的终端。
  3. 编译
    CC=cl ./configure --enable-static --enable-shared
    注意CC=cl 意思是指定cl编译器(msvc)
    make
    make install
    生成的文件放在了/usr/local/lib /usr/local/bin /usr/local/include 里面

编译ffmpeg(带libx264)

  1. 打开x86 Native Tools Command Prompt for VS 2017

    如果想编译出64位的.lib 或者 .dll , 需要打开x64,后面无需改变。
  2. 在这个终端下,同样cd到C:/msys2_64, 然后运行msys2_shell.cmd 打开一个新的unix终端,然后使用这个新的终端。
  3. 编译(时间非常长,可能半个小时上)
    ./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared (这个命令时间相当长,如果顺利的话后面就没什么问题,失败的话检查前面有没有什么问题)
    make (半个小时以上)

如果报错:
fftools/cmdutils.c(1119): error C2065: “slib”: 未声明的标识符
fftools/cmdutils.c(1119): error C2296: “%”: 非法,左操作数包含“char [138]”类型
fftools/cmdutils.c(1119): error C2059: 语法错误:“数字上的错误后缀”
fftools/cmdutils.c(1119): error C2059: 语法错误:“%”
fftools/cmdutils.c(1119): error C2017: 非法的转义序列
fftools/cmdutils.c(1119): error C2001: 常量中有换行符
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“{”(在“*”的前面)
fftools/cmdutils.c(1150): error C2059: 语法错误:“)”
fftools/cmdutils.c(1151): error C2054: 在“options”之后应输入“(”
fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“{”(在“*”的前面)
fftools/cmdutils.c(1252): error C2059: 语法错误:“)”
fftools/cmdutils.c(1253): error C2054: 在“avclass”之后应输入“(”
fftools/cmdutils.c(1261): error C2275: “AVInputFormat”: 将此类型用作表达式非法
打开ftools/ffprobe.c fftools/cmdutils.c ,搜索CC_IDENT这个宏(这个宏有问题),注释掉

//av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);
//print_str("compiler_ident", CC_IDENT);

make install
编译出来的文件在/usr/local/bin /usr/local/include /usr/local/lib 直接运用到自己的项目里面去。

题外话:linux,windows下的各种库的含义

动态链接库(.dll .so)

程序运行时才加载的,会加载当前目录的链接库或者系统下的,如windows平台下C:/windows/system32 。

windows平台(.dll)

1.指定.lib文件(函数的索引),只是告诉链接器这个可执行文件需要这个函数,但这个函数现在没有,运行时才去加载。
2.不指定lib文件,通过LoadLibrary加载链接库,在通过GetProcAddress获取函数指针。然后调用时使用函数指针,例如

typedef void (*pMyFunc)(LPVOID);
pMyFunc MyFunc;
HMODULE mydll = LoadLibraryW(L"mydll.dll"); // 加载dll,如果有的话返回非NULL
MyFunc = (pMyFunc)GetProcAddress(mydll, "MyFunc") // 获取dll里面MyFunc这个函数。注意这个函数必须是extern "C" 的,否则函数名不是MyFunc
MyFunc(NULL); //调用函数

linux平台(.so)

linux平台似乎只能用函数加载.so,但加载API不同,具体查百度。

静态库(.a .lib)

.a

这个库指的是Linux平台下的静态库,但windows平台也可以使用(使用mingw编译器或者cygwin等编译器,即windows平台下的gcc),有时候msvc也能够用,得库的编译方法。
静态库其实就是多个.o (.obj) 文件的集合,通过ar命令来打包成一个.a,在程序链接阶段时.a中函数的位置,把需要的函数嵌入到程序中(不需要全部嵌入,用什么嵌入什么)

.lib

windows平台才能用的链接库,分为2中情况,一种是只是提供函数索引的.lib文件(通常体积相当小),需要依赖.dll;一种是和.a类似的链接库,通常体积很大,这种链接库是多个.obj的打包。

内核库(.sys .ko)

.sys 是windows平台下的驱动程序,在x64机器下需要有驱动签名(很贵)才能加载。驱动程序拥有操作系统最高权限,编写驱动程序提供接口供给exe调用,windows平台下部分软件有驱动程序,例如所有的安全软件,大部分网络游戏(防止游戏被篡改),还有我们平常所讲的什么usb驱动,显卡驱动等。

.ko 是linux下的驱动程序,通过insmod加载,详细的我也不懂。

猜你喜欢

转载自blog.csdn.net/qq_26973089/article/details/82669348