采用ffmpeg静态库连接的视频应用工程调试(*.a文件的使用)
说明:1. 在MinGW/MSYS下,如果说我们要用ffmpeg的静态库本质上意味着我们用ffmpeg编译后的LIBxxxx.a
文件,(不是令人误解的lib文件,此处均用LIBxxxxx.a)
2.实际上生成动态库有更大的优越性,有了动态库,lib文件,h文件,就没有其它的依赖了。
libxxx.a本质上是object文件的归档,可能对其他库有依赖。一旦存在这种依赖,有可能
要把很多东西拖进来编译。
准备工作:
$ ./configure --enable-memalign-hack --enable-ffserver --enable-network --enable-protocols --enable-muxers --disable-yasm --enable-static --disable-shared --enable-w32threads --extra-cflags=-fno-reorder-functions
$ make
$make install (libavformat.a, libavcodec.a等会被拷贝到\MinGW\lib
动作:
1)选用ffmpeg SDK中的实例output_example_ffmpeg_SDK
2) 把原来工程的配置信息修改
2.1) 工程-〉属性 -〉Linker-〉Input, 修改加入如下*.a文件:
libavformat.a libavcodec.a libavutil.a libswscale.a // 编码相关
libmingwex.a // MinGW环境相关
libgcc.a // G++库
libmoldname80d.a // 其他文件
2.2)项目-〉工程-〉Linker -> General - > Additional Library Directories
加入如下目录:
2:\MinGW\lib\gcc\mingw32\4.5.2 ----〉MinGW中Gcc库
3:\MinGW\lib --> MinGW自己的库
4:d:\minGW\mysys\1.0\local\lib --> ffmpeg编译make install后拷贝到此地的静态库文件(*.a)
2.3) 报错和解决
1) 不认识guess_format. 解决: #define guess_format av_guess_format
2)不认识av_alloc_format_context 解决: #define av_alloc_format_context avformat_alloc_output_context
2.4) 重新编译报错
1)error LNK2019: unresolved external symbol _sws_scale referenced in function _write_video_frame
output_example.obj -〉output_example_ffmpeg_sdk
2)error LNK2019: unresolved external symbol _sws_getContext referenced in function _write_video_frame
output_example.objoutput_example_ffmpeg_sdk
3)error LNK2019: unresolved external symbol __imp____lc_codepage referenced in function _wcsrtombs
libmingwex.a output_example_ffmpeg_sdk
4)error LNK2001: unresolved external symbol __imp____lc_codepage libmingwex.a output_example_ffmpeg_sdk
解决:
1)添加libswscale.a -> 解决错误1,2
2)$ ar -d libmingwex.a wcrtomc.o
$ ar -d libmingwex.a mbrtowc.o ---〉清楚mbrtowc/wcrtomc.o出libmingwex.a
说明:这只是临时的walkaround,做前备份,做完后恢复,否则可能影响下一次编译。
我做完静态编译ffmpeg后,试了一次动态编译,马上完蛋,恢复原来的库文件才通过。
2.5) 编译成功,运行 (成功替换ffmpeg SDK工程中)
一些猜测:
1)用Visual Studio带的lib命令,运行
$lib libxxxx.a
会自动生成一个libxxxx.lib文件,也许这个文件可以直接放到Visual Studio工程中和普通lib文件一样
使用。网上有说法“实际上最常用的lib是由lib.exe把*.obj生成的lib。”,既然*.a文件不过是*.o文件
的打包,估计Microsoft支持直接从*.a生成*.lib文件
2)网上似乎有直接转化*.lib到*.a的工具
(xgzhang ) |