如果我们要编译一个开源库,首先想到去网上搜索,这是最便捷、有效的方式。网上已经帮我们解决了编译问题,而且有些我们预先没有考虑到的问题它们也一并列出来了。但它们告诉了我们方法,却不够便捷,需要一步步手动操作。作为一个程序员,我们是要想办法让自己变得越来越懒。
它们如是说
例如,我们要交叉编译ortp
库,网上的答案往往是这样的:
$ tar zxvf ortp- 0.13.1.tar.gz // 解包
$ cd ortp-0.13.1
mkdir /home/net/arm-ortp // 用户名为net
$ CC=arm_v5t_le_gcc ./configure --prefix=/home/net/arm-ortp/ --host=arm-linux --target=arm-linux --disable-static --enable-fixed-point --disable-glib
//需要加上 --disable-glib(禁止glib库),否则会因为缺少gthread 等库而无法编译。
$ make clean
$ make
$ make install
构建自动编译脚本
创建一个名叫ortp
的目录,然后按照以下三步构建三个不同的文件。
首先,我们构建一个param.mk
文件,包含下载的文件名、解压后目录的名称、下载路径,填写以下内容:
FILENAME=ortp-0.27.0.tar.gz
DIRNAME=ortp-0.27.0
DOWNLOADURL=http://download.savannah.gnu.org/releases/linphone/ortp/sources/ortp-0.27.0.tar.gz
为何不从下载路径中截取出文件名?因为我们下载的不仅仅是压缩包,可能是从github
下载的,或者是通过其它途径下载的,那么截取的方式可能并不一样。那么目录名也是同样一个道理。
其次,创建一个编译的脚本build.sh
,内容如下:
#!/bin/bash
source param.mk
CURDIR=`pwd`
if [ ! -f ${FILENAME} ]; then
wget ${DOWNLOADURL}
fi
tar -xzvf ${FILENAME}
mkdir out
# build lib
cd ${DIRNAME}
./configure --prefix=${CURDIR}/out
make
make install
cd ..
cp -rf out/include/* ${CURDIR}/../prebuild/include/ortp
cp out/lib/*.a ${CURDIR}/../prebuild/libs
在编译的时候,其实可以写一个单独的Makefile
,里面加入更丰富的内容,例如交叉编译工具。
再者,构建一个清理的脚本clean.sh
,内容如下:
#!/bin/bash
source param.mk
rm -f ${FILENAME}
rm -rf ${DIRNAME}
rm -rf out
编译多个库
在ortp
的同级目录构建一个build.sh
文件,用来编译各个开源库。完成之后,就可以轻松完成开源库的编译了。