Cygwin 交叉编译 ffmpeg for win ce
好久没有上博客园了,最近一直在忙着做windows mobile上面的音视频播放器。
ffmpeg作为一个开源的比较好的解码库,编码库,音视频播放位一体的程序,很值得参考,虽然直接把他一直到mobile上面效率不佳,但是经过针对arm 汇编优化后的解码库还是不错的。我在我的项目里面准备使用它的解码库,根据自己的实际需要裁减编译成vs2005可用的静态库。
从网上找了很多资源,可是都有头没尾的,自己实际编译了一下。整理供自己以后编译用,呵呵。
环境:Windows XP 下用Cygwin,cygwin的版本无所谓,安装一个相对完整的cygwin就ok了。
编译器用cygwin-cegcc-mingw32ce-0.51.0-1,这个是一整个cygwin或者linux下面编译ce程序的工具链。下载地址是 direct link
源码:我用的是国外一个播放器裁减的他们在windows ce上面编译过的版本,下载地址为http://nchc.dl.sourceforge.net/sourceforge/ambulant/ffmpeg-wm5.zip 是2009年2月份的一个版本,还可以接受,不是太老。
下面就开始了:
1.将cygwin-cegcc-mingw32ce-0.51.0-1解压到 cygwin的安装目录下,如果驻cygwin的安装目录为c:\cygwin,
那么解压后cegcc的目录应该为c:\cygwin\opt\mingw32ce
2.将源码解压,随便你想放到哪里,假设c:\cygwin\ffmpegwm5 下面就行
3.打开cygwin,进入源码目录,如 cd /ffmpegwm5
4.修改PATH, 在命令行健入 PATH=/opt/mingw32ce/bin:$PATH
5.开始编译,输入以下configure选项:
./configure --enable-memalign-hack --target-os=mingw32ce --arch=arm --enable-cross-compile \
--cross-prefix=arm-wince-mingw32ce- --enable-small \
--enable-static --enable-shared \
--disable-mmx --disable-zlib --disable-ipv6 --disable-debug \
--disable-ffmpeg --disable-ffserver --disable-ffplay \
--disable-encoders --disable-network --disable-muxers --disable-decoders --disable-filters \
--disable-demuxers --disable-devices --disable-protocols --disable-bsfs --disable-parsers \
--enable-decoder=mpeg4 \
--enable-decoder=h264 --extra-cflags="-march=armv4 -mtune=xscale"
这个是我自己的,你可以./configure --help来看具体的configure配置选项,还有他的解码库什么的。
6.打开c:\cygwin\opt\mingw32ce\arm-wince-mingw32ce\include\errno.h
注掉 11行 //#ifdef __COREDLL__
12行 //# include_next <errno.h>
13行 //#else /* __COREDLL__ */
107行//#endif /* Not __COREDLL__ */
当然,你要高兴只把11行改成//#ifdef 0 也行。都一样的。
然后,按先后顺序,分别进入libavutil,libavcodec,libavformat,分别make,就得到 dll,但是他最后会提示你make:lib command not found之类的错误,这个不要担心,呵呵,是不能生成lib而已。
7. pexports *.dll > *.def 用这个工具对咱们的dll生成def文件,方便下一步生成lib,这个工具的下载地址是http://www.emmestech.com/software/pexports-0.43/pexports-0.43.zip 下载完了再bin目录下找到这个工具,生成def文件即可。
8. 生成lib文件。\Microsoft Visual Studio 8\VC\bin\lib.exe /def:*.def /MACHINE:ARM 这个就可以生成lib,他中间可能会提示你mspdb80.dll无法找到,这个文件其实有,只是和lib不同路径。解决方法:添加系统变量(Path),这样:我的电脑->属性->高级->环境变量->系统变量,在path中添加C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;,注意结尾最后用“;”。下面在运行就可以生成.lib文件了。具体各个编译器生成lib,dll什么不同的,可以参考 http://www.geocities.com/yongweiwu/stdcall.htm
9.希望大家喜欢,因为lib我编译出来的不一定适合大家用,就不上了,大家自己编译吧。
ps:
很多同学发现这个方法引用函数没有问题,可是在引用dll里面全局变量的时候会有问题。这个主要是因为方法不对,下面给出全局变量的调用办法。
#pragma comment(lib,"../ffmpeg/lib/avcodec.lib")
extern AVCodec _declspec(dllimport) h263_decoder;
extern AVCodec _declspec(dllimport) mpeg4_decoder;
extern AVCodec _declspec(dllimport) h264_decoder;
posted on 2009-05-21 15:33 JesseZhao 阅读(10556) 评论(14) 编辑 收藏 举报