windows下编译64位ffmpeg的问题。以64位 zlib为例

2023-05-16

x264,265。。。等等10几个库都很顺利的编译过去了,zlib的64位库在vs2015下下编译通过了。放到ffmpeg环境里。死活找不到。卡了我整整两天。怎么折腾,始终提升error: zlib requested, but not found.开始各种捣鼓。安装libz-devel.自己编译,改各种pc文件,lib文件名。不得法。百度也没说这个的,后来翻qiang google搜到一篇文章,才明白咋回事,的确不能像无头苍蝇一下乱撞。哪个库编译不过。首先看ffbuild/config.log文件查找原因。错误虽然提示再最后一行。但是更详细的原因要在这个文件前面部分仔细查找。一般说的都很详细。像我这个,人家上面写着一行:

check_pkg_config zlib zlib zlib.h zlibVersion
test_pkg_config zlib zlib zlib.h zlibVersion
false --exists --print-errors zlib
check_lib zlib zlib.h zlibVersion -lz
check_func_headers zlib.h zlibVersion -lz
test_ld cc -lz
test_cc
BEGIN ./ffconf.o2M6qpqs/test.c
    1	#include <zlib.h>
    2	#include <stdint.h>
    3	long check_zlibVersion(void) { return (long) zlibVersion; }
    4	int main(void) { int ret = 0;
    5	 ret |= ((intptr_t)check_zlibVersion) & 0xFFFF;
    6	return ret; }
END ./ffconf.o2M6qpqs/test.c
cl -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D_WIN32_WINNT=0x0600 -nologo -DHAVE_UNISTD_H=0 -MD -c -Fo./ffconf.o2M6qpqs/test.o ./ffconf.o2M6qpqs/test.c
test.c
d:\develop\visualstudio\vcpkg\installed\x86-windows\include\zconf.h(477): fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory

实际上就是unistd.h文件找不到的原因。实际上需要修改一处zconf.h中的一处错误。需要注释掉

//#if 1    /* was set to #if 1 by ./configure */
#if 0
#  define Z_HAVE_UNISTD_H
#endif

这样就不在需要引用unistd.h文件了。也就没有了错误。

还有个错误。我最初总是抱着自己的lib目录下的东西修改。其实仔细一看ffmpeg是autodetect的系统文件夹/ming64/lib下面的库。用自己的lib目录还是系统目录。其实人家log文件里面也有提示的:

AUTODETECT_LIBS='
    
    alsa
    appkit
    avfoundation
    bzlib
    coreimage
    iconv
    libxcb
    libxcb_shm
    libxcb_shape
    libxcb_xfixes
    lzma
    schannel
    sdl2
    securetransport
    sndio
    xlib
    zlib

只要是放在这个autodetect_libs里面的都是优先查找系统目录。

还有几个技巧。看lib是否存在可以用命令:pkg_config --libs zlib来查看,

还有一个用mingw64,msvc交叉编译的问题。当需要引用自己的lib路径时候。如果按照传统的引用方法;

--extra-ldflags=-L/d/msys64/git/ffmpeg/lib

这样引用msvc编译器是找不到库路径的。应该用-libpath这种风格。并且当引用多个库时候应该是这种写法。不能是空格分号或者逗号

--extra-ldflags="-LIBPATH:/d/msys64/git/ffmpeg/lib -LIBPATH:/d/msys64/lib" 

启动mingw64和msvc交叉编译环境没啥门道,按网上说的来就行。这里也备注一下:

dos窗口运行
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
编辑D:/msys64/msys2_shell.cmd,
将其中的:rem set MSYS2_PATH_TYPE=inherit “rem”注释删除掉,成为:set MSYS2_PATH_TYPE=inherit
 msys2_shell.cmd -mingw64
在窗口上右击鼠标,选择[Options]菜单,选择[Text],locale选择:zh_CN,Character set 选择 GBK。

avs不要了,没用,没法编译
 
./configure --toolchain=msvc --arch=x86_64 --target-os=win64 --enable-gpl --enable-version3 --enable-nonfree --enable-static --enable-shared --enable-ffplay --enable-zlib --enable-libx264 --enable-libx265 --enable-cuda --enable-cuvid --disable-bzlib  --enable-iconv --enable-libmfx  --enable-libmp3lame --enable-libfdk-aac --enable-libvo-amrwbenc --enable-libopencore-amrnb --enable-libxvid --enable-libopencore-amrwb --enable-nvenc --enable-libopenh264 --extra-ldflags="-LIBPATH:/d/msys64/git/ffmpeg/lib -LIBPATH:/d/msys64/mingw64/lib" 
 

ps:--enable-bzlib,其实需要安装的是bzip2的库。

--enable-sdl2的时候。因为开始设定的mingw64使用的msvc作为link工具。所以注意:

SDL2-devel-2.0.12-VC.zip (Visual C++ 32/64-bit)
SDL2-devel-2.0.12-mingw.tar.gz (MinGW 32/64-bit)

要下载vc的,不能下载mingw的。但是pk-config文件夹里面的pc文件要用ming里面的,借用一下。如果提示找不到mingw32.lib这时候要修改下sdl2.pc文件。把最后两行改一下

原来的是这样的:

Libs.private: -lmingw32 -lSDL2main -lSDL2 -mwindows  -Wl,--no-undefined -Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid -static-libgcc
Cflags: -I${includedir}/SDL2  -Dmain=SDL_main

修改为:

Libs: -L${libdir}   -lSDL2
Libs.private:
Cflags: -I${includedir}/SDL2

fftools/ffprobe.c(3047): error C2001: 常量中有换行符

我就把这一行ffprobe.c的3047行打印字符给注释了,两处代码:

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

//print_str("compiler_ident", CC_IDENT);

还有如下报错:也是因为CC_IDENT引起的,解决方法就是上面注释

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”: 将此类型用作表达式非法

 

写了个简要说明,避免大家以后走弯路。呵呵

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows下编译64位ffmpeg的问题。以64位 zlib为例 的相关文章

随机推荐