在PC机Linux上,安装开源软件,一般如下:

tar -xzf open_source_software.tar.gz
cd open_source_software
./configure
make
make install

但要将开源软件移植到嵌入式Linux单板上运行,情况却略有不同。

其实,无论是在PC机Linux上安装开源软件,还是将开源软件移植到嵌入式Linux单板上,其操作过程本质上是完全相同的。只是在PC机Linux上,各项事宜默认就得到了正确的组合。而嵌入式Linux单板,则需要明确地为这些事宜构造正确的组合。

一、在PC机linux上安装交叉编译工具链。
就是将工具链的压缩包解压到某个路径下,就完成了安装。
假设target单板是arm处理器,运行Linux系统,用的工具链是arm-linux-gcc-3.4.1,工具链安装路径是/opt/arm-linux-gcc-3.4.1。
修改PATH环境变量。否则后面使用/设定编译器时,就得用/opt/arm-linux-gcc-3.4.1/bin/arm-linux-gcc。

二、开源库的移植
由于有些开源应用程序本身又依赖于一些开源库。因此,移植步骤是,先移植开源库,再移植开源应用程序。不然开源应用程序的编译就成问题。
先介绍开源库的移植,其实就是对工具链自带的库进行了扩充。
例,假设上述arm工具链的stdio.h文件路径为/opt/arm-linux-gcc-3.4.1/include/stdio.h
那移植完开源库之后:
/opt/arm-linux-gcc-3.4.1/include/下面就会多出一些头文件。
/opt/arm-linux-gcc-3.4.1/lib/下面就会多出一些.a文件或.so文件。
当然,凡是单板上用到的/opt/arm-linux-gcc-3.4.1/lib/下面的.so文件,不管是工具链自带的,还是移植的,都要拷贝到单板的根文件系统/usr/lib/目录中。

移植步骤:
获取并解压开源库的源码包,并进入源码包的根目录。
1. 配置
指定如目标单板的操作系统、CPU、工具链等信息。
如何指定这些信息呢,不同软件可能不同。如果不熟悉,就要阅读源码包中附带的如README、INSTALL等文件。
常见配置方法是通过./configure命令进行。当然有些开源包可能叫./config或其他名字。
configure通常是很大的shell脚本,应该都是用自动化工具生成的。不用费力去读他。

以opensll为例。配置命令为:
./config–prefix=/opt/arm-linux-gcc-3.4.1/ linux-elf:arm-linux-gcc
指定安装路径是/opt/arm-linux-gcc-3.4.1/,目标类型是linux-elf,工具链是arm-linux-gcc。
注 : 这个路径是交叉工具链include目录及lib目录的父目录。因为头文件及编译后的库文件,需要分别安装到include与lib目录中。

在配置命令中,还可指定其他选项,以做进一步的定制。
可通过 ./configure –help命令查看所支持的可定制选项。会输出所支持的各种选项,选项含义,以及默认是否打开等信息。
如果失败,通常是编译系统依赖的某个工具没找到。安装即可。
2. 编译
make
3. 安装
make install
本例指定安装路径:–prefix=/opt/arm-linux-gcc-3.4.1/
因此,头文件(例如,openssl/ssl.h)及编译后的库文件(如libcrypto.a libssl.a),被安装到/opt/arm-linux-gcc-3.4.1/include与 /opt/arm-linux-gcc-3.4.1/lib。就相当于扩充了/opt/arm-linux-gcc-3.4.1自带的库。接下来,就可以编译使用了opensll的开源应用程序了。

三、开源应用程序的移植
获取并解压开源应用程序的源码包。
1. 配置
和开源库的移植类似。要指定诸如目标单板的操作系统、CPU、工具链等信息。不熟悉,同样要仔细阅读源码包中附带的诸如README、INSTALL等文件。
以e2fsprogs-1.42.5为例:
mkdir release
cd release/
../configure –host=arm-linuxCC=arm-linux-gcc
当然,同样可以带上更多的参数,做更多的定制。如,带上参数 LDFLAGS=-static从而指定静态链接。

如失败,有两个原因:
a). 编译系统依赖的某个工具没找到。安装即可。
b). 开源应用程序的某个功能项所依赖的某个开源库没有找到。
解决办法:
一是移植此开源库,按照前面的方法;
二是通过 –disable-funcname关闭此功能项,如果确实用不到该功能项的话。
2. 编译
make
3. 安装
需将上述编译出的可执行文件、程序运行需要用到的配置文件、程序运行需要用到的所有动态库(无论是工具链自带的库,还是移植的库),都拷贝到单板根文件系统。例如:
库文件拷贝到/usr/lib/。
配置文件拷贝到/etc/。
可执行文件拷贝到/bin或/usr/bin。

这一步,最好写脚本。
因为即使在第1步中,已经指定安装目录为单板的根文件系统。
make install未必好用,可能会安装过多东西(如man手册,单板上并不需要),或者某些文件安装的路径未必正确,或者安装失败

1.开源软件包找不到Makefile
通常是采用configure方式组织的,那就使用configure生成Makefile文件。例如移植module-init-tools-3.2:
CC=arm-linux-gcc ./configure –prefix=/my_depmod –without-gun-ld –host=arm-linux
2.解压后有Makefile的,同时里面有CC选项的,这种情况比较简单,只要修改CC等选项即可。
例如,移植goahead到单板上,解压之后Makefile中修改:
CC = arm-linux-gcc
AR = arm-linux-ar
然后Make即可。如果Makefile中有CROSS_COMPILE也同样修改交叉编译工具即可。
3.有Makefile但是找不到CC或者CROSS_COMPILE的。采用make CROSS=arm-linux-进行编译。