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系统下的软件包。
如果你平时用gcc进行开发的话,需要编译.a的静态库或者.dll的动态库。如果用msvc开发的话需要.lib静态库或者.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文件。
CC=cl ./configure --enable-static --enable-shared
./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
(这个命令时间相当长,如果顺利的话后面就没什么问题,失败的话检查前面有没有什么问题) 如果报错:
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 直接运用到自己的项目里面去。
程序运行时才加载的,会加载当前目录的链接库或者系统下的,如windows平台下C:/windows/system32 。
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,但加载API不同,具体查百度。
这个库指的是Linux平台下的静态库,但windows平台也可以使用(使用mingw编译器或者cygwin等编译器,即windows平台下的gcc),有时候msvc也能够用,得库的编译方法。
静态库其实就是多个.o (.obj) 文件的集合,通过ar命令来打包成一个.a,在程序链接阶段时.a中函数的位置,把需要的函数嵌入到程序中(不需要全部嵌入,用什么嵌入什么)
windows平台才能用的链接库,分为2中情况,一种是只是提供函数索引的.lib文件(通常体积相当小),需要依赖.dll;一种是和.a类似的链接库,通常体积很大,这种链接库是多个.obj的打包。
.sys 是windows平台下的驱动程序,在x64机器下需要有驱动签名(很贵)才能加载。驱动程序拥有操作系统最高权限,编写驱动程序提供接口供给exe调用,windows平台下部分软件有驱动程序,例如所有的安全软件,大部分网络游戏(防止游戏被篡改),还有我们平常所讲的什么usb驱动,显卡驱动等。
.ko 是linux下的驱动程序,通过insmod加载,详细的我也不懂。