编译环境:Win7 64bit -> VMWare Player -> Ubuntu14.04 64bit
目标环境:Netgear WNDR3700v3 + DD-WRT Kong's MOD 12200 + 移动硬盘
MiniDLNA (http://sourceforge.net/projects/minidlna/files/) 是现在家用NAS里最主流的开源DLNA Server软件之一,且至今仍然在活跃更新中。笔者的应用环境下,使用带USB接口的WNDR3700结合硬盘充当一个低端的NAS。
由于现成的固件版本,在miniDLNA v1.1.0之后都没有持续同步升级。因此索性贡献出好几个中午从头搞定了整个交叉编译。
作为其它开源项目的交叉编译来说,整个过程应该是通用的。
第一步,首先要搞到合适的ToolChain,也就是交叉编译器
通俗点说,在PC上用普通的gcc只能编译出PC上跑的程序,想编译出mips cpu能跑得程序,就得用相应的toolchain里面的gcc
所幸的是我们并不需要自己开发工具链,dd-wrt官方提供的最新版本工具链在这里
http://www.dd-wrt.com/site/support/other-downloads
只有一个压缩包,略坑,各种目标环境的工具链(ARM, MIPS等)都以一个单独的文件夹放置在里面,解压后高达30多G。
WNDR3700v3的CPU是基于MIPS处理器的BCM4718A,借鉴前人经验,我最后选择的是toolchain-mipsel_gcc-linaro_uClibc-0.9.32
这里要注意的是,DD-WRT提供的这个大包,所有的toolchain都是64bit版本的,也就是说你的编译环境,必须是一个64bit的linux
第二步,要理清楚所有编译 miniDLNA所需要的依赖库
在minidlna的README文档中,依赖的库包括:
libexif, libjpeg, libid3tag, libFLAC, libvorbis, libsqlite3, libavformat (the ffmpeg libraries)
而这些库的编译本身又依赖于其它几个库,比如zlib等,因此在编译miniDLNA前,实际所需要编译的所有库包括:
zlib, libuuid, libexif, libjpeg, libid3tag, libogg, libFLAC, libvorbis, libsqlite3, ffmpeg
这些库需要按合适的顺序,一个个下载编译好。
注意,由于目标环境是一个mips的cpu和一个封闭的dd-wrt系统,不能把事情搞得太复杂。因此所有的库都一定是静态编译的。
交叉编译的两个步骤,一是在系统环境变量中添加toolchain所在的路径,对于笔者来说:
export PATH=$PATH:"/hom