整个周末基本上就浪费在折腾ffmpeg的编译上了。
从接手实验室的某个项目开始,就一直在用ffmpeg这个强大的东西。不知道啥时候开始,ffmpeg的结构做了一次调整,几个头文件分别放到了单独的目录,结果mingw就无法编译了,错误是"No rule to make target `libavdevice/avdevice.dll' ", 好像这没啥关系。后来一直也没去理会过这个,直到前天写程序的时候突然被ffmpeg的强大所感动, 开始打算找出问题,编译个新版本,ft,多幼稚,这一下搞得我浪费了差不多2天时间。 首先用cygwin尝试编译,却发现非常的顺利,不明白。几经折腾,才发现原来是makefile变了,而我的mingw上的make版本低了,3.79,更新到3.81后就顺利编译通过了,但是从3.79->3.80->3.81究竟有些啥区别我也没去细究了,总之能够编译了。
编译是完成了,但是编译后的程序却有问题,播放mepg-4的avi没问题,但是播放264却非常干脆的挂了,这太要命了。突然我想起以前用ffmpeg的时候总会打印一段话,大概意思是说libavcodec应该用4.2以上的gcc编译,否则会很慢或者Crash。所以我立刻去mingw上找最新版本的gcc,却发现只有4.3.0 alpha的,但是这个时候最新的gcc已经是4.3.2了,alpha的用着多不爽。google吧,还真有三方的mingw gcc 4.3.2,叫TDM gcc吧,欣喜之下立刻下来安装,编译。。。 这次更郁闷了,编译倒是很顺利,但是ffplay没法用,"Application failed to initialize properly"。 无奈,alpha就alpha吧,凑合着用。 但是官方的果然就是官方的啊,imba,这alpha版本也足够了,编译、运行统统OK,牛!
但是老毛病又来了,alpha还是看着不爽,一定要搞个4.3.2来试试才罢休。于是下载了gcc4.3.2,找到了个网上的教程,
用MINGW编译GCC4.2.2指南。 这个过程太郁闷了,之间出的大小问题无数,主要这几个大问题:
1. gmp无法编译,从4.2.1到4.2.3都试过了,也在google上搜索了,但是很少见到有说gmp编译不过的,最后找了个编译好的成品
GMP Install Instruction for Windows Platform。题外话,这东西听起来很牛的样子,我太土了。
2. libtool问题,中间有个libtool 运行m4的命令,始终报告错误 m4 gcc : no such file or directory。在这里卡住后,已经折腾到了凌晨3点半。怒了,决定把mingw全部重装一遍,不过睡一觉先。 重装mingw又是件繁琐的事情,基本上大部分组件的最新版本都下载安装了。还好努力没白费,不但这个错误通过了,而且gmp也顺利的编译了。其实还是不明白到底是mingw系统中哪个部分出错了
3.最后一个组件貌似libgomp,缺少pthreads。找找了,libpthread.a是存在的,但是没pthread的头文件,后来是在这里下载了
POSIX Threads (pthreads) for Win32 的头文件,但是貌似这里的bin和source中带的头文件不一样,source中的三个头文件才是可用的。
编译过程很漫长,build目录下文件累积大概700M,本本的风扇一直呼呼的转,最后嘎嘎直响向我抗议,唉,明天拿去维修吧。
幸运的是最后编译成功了:
$ gcc -v
Using built-in specs.
Target: i686-pc-mingw32
Configured with: ../../source/configure --prefix=/mingw --enable-languages=c,treelang --disable-nls --disable-werror --disable-win32-registry --enable-sjlj-exceptions --enable-threads=win32 --disable-libstdcxx-pch --enable-fully-dynamic-string --enable-libgomp --with-tune=generic --with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe --with-gcc --with-gnu-ld --with-gnu-as
Thread model: win32
gcc version 4.3.2 (GCC)
configure option 基本就是抄的那个链接的。
不幸的是结果还是一样的。静态连接的ffplay可以使用,但是动态连接的仍然和TDM发行的gcc4.3.2编译结果一样,"Application failed to initialize properly"。所以还是等待官方的mingw吧,不过这个alpha版的也没啥问题,不过我一直对性能比较以及alpha字眼过于在乎,才会去实验编译新版本,其实上自己也知道没啥差异,就那个毛病。
中间我还有个想法是能不能把mingw编译的静态库在VC下链接,结果一试发现不行,粗略看了看,基本上都是CRT的函数找不到,可能是mingw用的CRT lib不一样,没有VC6,也就没去试了。路过的朋友,如果知道些什么,请教了,:)