技术交流请联系企鹅252726O5O

先介绍一下我的软硬件环境:

编译环境: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:"/home/ekkizzu/toolchain/toolchain-mipsel_gcc-linaro_uClibc-0.9.32/bin"

二是执行./configure时,添加上这个属性  --host=mipsel-linux-uclibc 来选择交叉编译器

这样在执行make时,调用的就是toolchain路径下的mipsel-linux-uclibc-gcc作为编译器了

前文说库一定是要静态编译的,因此./configure的时候还要加上--static或者--disable-share这样的属性

这些属性的写法不同的开源项目可能略有差别,具体可以通过./configure --help来逐个查看

比如说zlib就比较特殊,它的年代比较古老,不能用--host属性,用的是CHOST环境变量来选择交叉编译器

第三步,上面这些都挨个搞定之后,同样的方法编译miniDLNA就可以了

所有的事情都做好之后,检查一下生成的二进制文件格式,应该得到类似这样的输出:

linearhit@ubuntu:~/dd-wrt/minidlna_build/sbin$ file minidlnad
minidlnad: ELF 32-bit LSB  executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked (uses shared libs), stripped

Bingo!

第二步和第三步的全部脚本在这里:

export DEST=/home/linearhit/dd-wrt/minidlna_build
export PATH=$PATH:"/home/linearhit/toolchain/toolchain-mipsel_gcc-linaro_uClibc-0.9.32/bin"
export LD_LIBRARY_PATH="/home/linearhit/toolchain/toolchain-mipsel_gcc-linaro_uClibc-0.9.32/lib"
export CFLAGS="-Os -fPIC -ffunction-sections -fdata-sections"
export CPPFLAGS="-Os -fPIC -ffunction-sections -fdata-sections"
export LDFLAGS="-Wl,--gc-sections"
export STRIP=mipsel-linux-uclibc-strip
# zlib
[ -e zlib-1.2.8.tar.gz ] || wget -O zlib-1.2.8.tar.gz http://zlib.net/zlib-1.2.8.tar.gz
tar zxf zlib-1.2.8.tar.gz
cd zlib-1.2.8/
export CHOST=mipsel-linux-uclibc
./configure --prefix=$DEST --static
make clean && make
ZLIB=`pwd`
cd ..
# FFMPEG
[ -e ffmpeg-2.0.tar.gz ] || wget -O ffmpeg-2.0.tar.gz http://www.ffmpeg.org/releases/ffmpeg-2.0.tar.gz
tar zxf ffmpeg-2.0.tar.gz
cd ffmpeg-2.0/
make distclean
./configure --enable-cross-compile --cross-prefix=mipsel-linux-uclibc- --arch=mips --enable-vfp --target-os=linux --prefix=$DEST --extra-cflags="-I$ZLIB" --extra-cxxflags="$CFLAGS -I$ZLIB" --extra-ldflags="-L$ZLIB" --enable-small --enable-zlib --disable-shared --disable-debug --disable-programs --disable-mips32r2 --disable-mipsdspr1 --disable-mipsdspr2 --disable-mipsfpu
make clean && make
FFMPEG=`pwd`
cd ..
# libuuid
[ -e e2fsprogs-libs-1.42.11.tar.gz ] || wget -O e2fsprogs-libs-1.42.11.tar.gz http://sourceforge.net/projects/e2fsprogs/files/e2fsprogs/v1.42.11/e2fsprogs-libs-1.42.11.tar.gz
tar zxf e2fsprogs-libs-1.42.11.tar.gz
cd e2fsprogs-libs-1.42.11/
./configure --host=mipsel-linux-uclibc --prefix=$DEST --disable-elf-shlibs --disable-quota
cd lib/uuid/
make clean && make -j1
LIBUUID=`pwd`
cd ../../..
# libsqlite
[ -e sqlite-autoconf-3080600.tar.gz ] || wget -O sqlite-autoconf-3080600.tar.gz http://sqlite.org/2014/sqlite-autoconf-3080600.tar.gz
tar zxf sqlite-autoconf-3080600.tar.gz
cd sqlite-autoconf-3080600/
./configure --host=mipsel-linux-uclibc --prefix=$DEST --disable-shared
make clean && make
SQLITE=`pwd`
cd ..
# libexif
[ -e libexif-0.6.21.tar.gz ] || wget -O libexif-0.6.21.tar.gz http://sourceforge.net/projects/libexif/files/libexif/0.6.21/libexif-0.6.21.tar.gz
tar zxf libexif-0.6.21.tar.gz
cd libexif-0.6.21/
./configure --host=mipsel-linux-uclibc --prefix=$DEST --disable-shared
make clean && make
LIBEXIF=`pwd`
cd ..
# libjpeg
[ -e jpegsrc.v9.tar.gz ] || wget -O jpegsrc.v9.tar.gz http://www.ijg.org/files/jpegsrc.v9.tar.gz
tar zxf jpegsrc.v9.tar.gz
cd jpeg-9/
./configure --host=mipsel-linux-uclibc --prefix=$DEST --enable-maxmem=8 --disable-shared
make clean && make
LIBJPEG=`pwd`
cd ..
# libid3tag
[ -e libid3tag-0.15.1b.tar.gz ] || wget -O libid3tag-0.15.1b.tar.gz http://sourceforge.net/projects/mad/files/libid3tag/0.15.1b/libid3tag-0.15.1b.tar.gz
tar zxf libid3tag-0.15.1b.tar.gz
cd libid3tag-0.15.1b/
CPPFLAGS="$CPPFLAGS -I$ZLIB"
CFLAGS="$CFLAGS -I$ZLIB"
LDFLAGS="$LDFLAGS -L$ZLIB"
export LIBS="-lz"
./configure --host=mipsel-linux-uclibc --prefix=$DEST --disable-shared
make clean && make
LIBID3TAG=`pwd`
cd ..
# libogg
[ -e libogg-1.3.2.tar.gz ] ||wget -O libogg-1.3.2.tar.gz http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
tar zxf libogg-1.3.2.tar.gz
cd libogg-1.3.2/
./configure --host=mipsel-linux-uclibc --prefix=$DEST --disable-shared
make clean && make
LIBOGG=`pwd`
cd ..
# libvorbis
[ -e libvorbis-1.3.4.tar.gz ] || wget -O libvorbis-1.3.4.tar.gz http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz
tar zxf libvorbis-1.3.4.tar.gz
cd libvorbis-1.3.4/
LDFLAGS="$LDFLAGS -L$LIBOGG/src/.libs"
CPPFLAGS="$CPPFLAGS -I$LIBOGG/include"
CFLAGS="$CFLAGS -I$LIBOGG/include"
LIBS="-logg"
./configure --host=mipsel-linux-uclibc --prefix=$DEST --with-ogg=$LIBOGG --with-ogg-libraries=$LIBOGG/src/.libs --with-ogg-includes=$LIBOGG/include --disable-shared
make clean && make
LIBVORBIS=`pwd`
cd ..
# libflac
[ -e flac-1.2.1.tar.gz ] || wget -O flac-1.2.1.tar.gz http://sourceforge.net/projects/flac/files/flac-src/flac-1.2.1-src/flac-1.2.1.tar.gz
tar zxf flac-1.2.1.tar.gz
cd flac-1.2.1/
./configure --host=mipsel-linux --prefix=$DEST --with-ogg=$LIBOGG --disable-shared
sed -i -e "33 i #include " examples/cpp/encode/file/main.cpp
make clean && make
LIBFLAC=`pwd`
cd ..
# minidlna
[ -e minidlna-1.1.4.tar.gz ] || wget -O minidlna-1.1.4.tar.gz http://sourceforge.net/projects/minidlna/files/minidlna/1.1.4/minidlna-1.1.4.tar.gz
tar zxf minidlna-1.1.4.tar.gz
cd minidlna-1.1.4/
CPPFLAGS="-I$ZLIB -I$SQLITE -I$LIBUUID -I$LIBEXIF -I$LIBJPEG -I$LIBID3TAG -I$LIBOGG/include -I$LIBFLAC/include -I$LIBVORBIS/include -I$FFMPEG"
CFLAGS="$CFLAGS -I$ZLIB -I$SQLITE -I$LIBUUID -I$LIBEXIF -I$LIBJPEG -I$LIBID3TAG -I$LIBOGG/include -I$LIBFLAC/include -I$LIBVORBIS/include -I$FFMPEG"
LDFLAGS="$LDFLAGS -L$ZLIB -L$SQLITE/.libs -L$LIBUUID -L$LIBEXIF/libexif/.libs -L$LIBJPEG/.libs -L$LIBID3TAG/.libs -L$LIBOGG/src/.libs -L$LIBFLAC/src/libFLAC/.libs -L$LIBVORBIS/lib/.libs -L$FFMPEG/libavutil -L$FFMPEG/libavcodec -L$FFMPEG/libavformat"
LIBS="-lsqlite3 -luuid -lexif -ljpeg -lavformat -lavcodec -lavutil -lid3tag -lFLAC -lvorbis -logg -lz -lpthread -ldl -lm"
./configure --host=mipsel-linux-uclibc --prefix=$DEST
make clean && make && make install
$STRIP -s -R .comment -R .note -R .note.ABI-tag $DEST/sbin/minidlnad

还有一件事别忘了,比如在编译libid3tag的时候需要依赖于zlib,通常是通过LIBS,CPPFLAGS等环境变量来告知库文件,头文件等存放的路径,但是要注意这些环境变量一定是加了export的系统变量,否则会提示找不到库文件或者头文件的哦

实战交叉编译——Ubuntu下交叉编译MiniDLNA到DD-WRT相关推荐

  1. ubuntu下交叉编译环境构建

    ubuntu下交叉编译环境构建(arm-linux-gcc-3.4.1.tar.bz2 ) 下载arm-linux-gcc-3.4.1.tar.bz2到任意的目录下. arm-linux-gcc-3. ...

  2. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  3. apache arm 交叉编译_MacOS 下交叉编译的折腾笔记

    这是这个系列 "折腾笔记" 的第一篇,希望能用更直白的方式去展现交叉编译的时候做了些什么.因此,这个教程并不是最佳实践,但是可以让小伙伴们有一个更直白的理解.之后,我会把笔记的重点 ...

  4. ubuntu下交叉编译arm内核模块

    安装编译环境及下载交叉编译工具: 1 2 3 4 5 apt-get install gcc make pkg-config git bison flex libelf-dev libssl-dev ...

  5. libevent 源码阅读 Ubuntu下muduo库的安装与使用

    libevent源码分析--代码结构_鱼思故渊的专栏-CSDN博客 LINUX实战:Ubuntu下muduo库的安装与使用 LINUX实战:Ubuntu下muduo库的安装与使用-LINUX入门-维易 ...

  6. 安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链

    本文主要介绍使用Android NDK生成独立交叉编译链,然后使用独立交叉编译链编译Android程序 下载NDK 下载与自己操作系统相吻合的版本 下载地址 解压到安装目录(如~/myndk): ta ...

  7. jsoncpp的安装与使用实战(windows交叉编译Ubuntu)

    开发环境:Windows10 + VS2017 + wsl 目的:交叉编译Ubuntu系统中需要的库文件 操作步骤: 1.Windows10系统中安装wsl,我安装的是Ubuntu18.04 LTS. ...

  8. Ubuntu 环境下交叉编译运行正点原子的程序

    Ubuntu 环境下交叉编译运行正点原子的程序 在校学生,求职过程中对方要求在Ubuntu环境下交叉编译stm32的程序,我觉得很有意思,因为之前就听说过可以在Linux环境下运行stm32的程序,因 ...

  9. 编译mini linux,Ubuntu 下 Mini2440 建立交叉编译环境

    在 Ubuntu 下 Mini2440 建立交叉编译环境 mini2440光盘中提供了三个版本的arm-linux-gcc,它们的作用分别是: 3.4.1:用于编译内核 3.3.2:用于编译Qutop ...

最新文章

  1. SQL查询语句[0]
  2. 常用sql操作语句实战演示
  3. java程序员目标_Java程序员的目标,你都达到了多少条?
  4. 利用Pin分析程序的动态行为特征
  5. html如何添加隶书字体,word如何添加隶书字体?
  6. Android中的App网络传输协议
  7. 计算空间中点到直线的距离
  8. win10跳过计算机密码,Win10怎么取消开机密码?Win10如何跳过开机密码?
  9. dialog在关闭的时候会刷新页面,并且地址后面多加了一个问号,导致数据查询不出来的解决方法
  10. linux 压缩文件软件,Linux下最好用的解压缩软件unar
  11. CorelDRAW X4精简版序列号大家为何对其情有独钟?x8
  12. win7计算机属性资源管理器停止工作,win7系统windows资源管理器已停止工作一直弹出来的处理方法...
  13. php监听input,js实时监听input中值变化
  14. 怎么简单快速的将多个中文文件转换成英文的名称
  15. 百万钱包借款时填资料一直显示服务器异常,百万钱包有连续放款失败,然后突然推过的吗?我已经失败四五...
  16. Anker推出Security SmartTrack卡,详谈苹果Find My技术
  17. C++语言学习笔记15:Clean 垃圾清理插件
  18. adb remount失败的解决办法:
  19. 如何使用一个for循环输出九九乘法表
  20. 前端导出excel(element+xlsx+filesaver插件),表格数据重复问题解决

热门文章

  1. [网络安全学习篇55]:SQL自动化注入
  2. https中SSL加密过程详解,看这一篇就够了!
  3. allegro画PCB是碰键盘软件会卡死
  4. 【法律适用】将微信记录作为打官司证据的最全攻略(2020法院版)
  5. 当客户在说要安全的时候,客户在想什么?
  6. Geek Talk 034:消费升级大环境下的空间设计
  7. “愉悦身心 伽倍健康”知识竞赛线上答题
  8. 线性代数基础概念与重要定义汇总
  9. 我的世界java启动程下载_我的世界java正版启动器最新下载
  10. UART Baudrate