如果我们要编译一个开源库,首先想到去网上搜索,这是最便捷、有效的方式。网上已经帮我们解决了编译问题,而且有些我们预先没有考虑到的问题它们也一并列出来了。但它们告诉了我们方法,却不够便捷,需要一步步手动操作。作为一个程序员,我们是要想办法让自己变得越来越懒。

它们如是说

例如,我们要交叉编译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文件,用来编译各个开源库。完成之后,就可以轻松完成开源库的编译了。

参考文章

交叉编译ortp


txgcwm
764 声望71 粉丝

Linux C/C++