【转】Cygwin 交叉编译 ffmpeg for WinCE

原文:http://www.cnblogs.com/jessezhao/archive/2009/05/22/1486351.html

 

好久没有上博客园了,最近一直在忙着做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
        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;

0
0
0
(请您对文章做出评价)
posted @ 2009-05-21 15:33 JesseZhao 阅读(1433) 评论(10)   编辑 收藏 网摘
Body:109.375,BeforeCate:0,125,Total:343.75

1588651
   回复   引用   查看     
#1楼 2009-05-21 16:32 | 施炯       
恩,好强啊,自己编译ffmpeg,学习一下。
   回复   引用   查看     
#2楼 [ 楼主]2009-05-21 16:50 | JesseZhao       
@施炯
编译不强,他们这些写的很强悍。我看到他们在针对arm cpu优化的汇编代码,绝对的强悍。搞得我现在都在学习汇编了。
   回复   引用   查看     
#3楼 2009-05-22 09:17 | 杨芹勍       
楼主好精神^^
   回复   引用   查看     
#4楼 2009-05-22 10:06 | DiggingDeeply       
呵呵,貌似这里都是点奈特的天下,这linux和ffmpeg没人用啊。
不过我还是支持你一下,原创精神
   回复   引用     
#5楼 2009-05-26 18:30 | LHNing[未注册用户]
非常感谢博主的这篇文章,小弟最近正在学习FFmpeg在WindowsMobile的交叉编译,您的这篇文章对我帮助实在太大了,但是小弟在学习的过程中遇到问题还请问一下您

我按照您的步骤走到输入configure选项时提示以下错误
arm-wince-mingw32ce-gcc is unable to create an executable file.
C compiler test failed.
If you think configure made a mistake, make sure you are using the latest
version from SVN. If the latest version fails, report the problem to the
[email protected] mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "config.err" produced by configure as this will help
solving the problem.

我的configure选项和您的一样,请问一下这是什么问题啊,非常感谢啊
   回复   引用   查看     
#6楼 [ 楼主]2009-05-26 18:37 | JesseZhao       
@LHNing
这个主要原因是你的包可能选择的不对,cygwin-cegcc-mingw32ce-0.51.0-1一定要用我给你连接的那个。另外也有可能是你的PATH设置那一步不对,注意步骤,呵呵
   回复   引用     
#7楼 2009-05-29 09:16 | LHNing[未注册用户]
非常感谢博主,在您的帮助下终于编译成功了
但是我是一个初学者,不知道我现在的这个编译结果是否正确,还请您帮帮忙:
我在libavutil目录下键入make命令,控制台输出如下:
$ make
rm -f libavutil.a
arm-wince-mingw32ce-ar rc libavutil.a adler32.o aes.o base64.o crc.o des.o fifo.o intfloat_readwrite.o lls.o log.o lzo.o mathematics.o md5.o mem.o random.o rational.o rc4.o sha1.o string.o tree.o
arm-wince-mingw32ce-ranlib libavutil.a
不知道这正确吗?
而且我在libavutil目录下只看到新生成的libavutil.a,没有dll
这个目录下的dll修改日期都是以前的,不知道这样是否正确?

我在configure后,控制台输出是:
(省略...)
License: LGPL
Creating config.mak and config.h...
config.h is unchanged

还请您帮忙看看,非常感谢啊:)
   回复   引用     
#8楼 2009-06-01 16:11 | LHNing[未注册用户]
问题解决了,原来是make之前没有clean,呵呵,谢谢博主啊,终于成功高出dll了,哈哈
   回复   引用     
#9楼 2009-06-24 14:24 | 晓路[未注册用户]
博主好,我有几个问题:

1:使用cygwin-cegcc-mingw32ce编出来的dll能否用于windows mobile5 平台呢??

2:上述方法生成的lib是那种完整的静态lib,还是配套dll的一个函数入口lib?我想只要静态库,而不是在工程中连接lib,运行的时候再去链dll。

3:所谓裁剪,就是指的编译时configure那一步吗,不需要自己在代码中进行工程上的修改(如删除吗)?

多谢博主!!!
   回复   引用     
#10楼 2009-07-18 17:15 | okooo[未注册用户]
编译出来的dll,不能在wm 6.1上被加载,提示非win32程序,请问是什么原因?急盼回复。

你可能感兴趣的:(【转】Cygwin 交叉编译 ffmpeg for WinCE)