如何移植开源软件到嵌入式Linux系统

来源:互联网 发布:php请假系统 编辑:程序博客网 时间:2024/06/01 07:30

linux嵌入式移植交叉编译

我们知道,在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上安装合适的交叉编译工具链。

这一步很简单,一般就是将工具链的压缩包解压到某个路径下,就完成了安装。

我们这里假设目标单板是arm处理器,运行Linux系统,

用的工具链是arm-linux-gcc-3.4.1,工具链安装路径是/opt/arm-linux-gcc-3.4.1。

并且,为了使用方便,我们已经将/opt/arm-linux-gcc-3.4.1/bin目录添加到PATH环境变量中了。这样就可以直接使用arm-linux-gcc、arm-linux-ld等命令了。

如果不这样做的话,后面使用/设定编译器时,就得用/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/目录中。

 

 

好了,下面说说具体移植步骤。

假设我们已经获取并解压了开源库的源码包,并且在shell中已经进入了源码包的根目录。接下来的工作,分三步进行。

1. 配置

注意,这是最关键的一步。在这一步中,我们要指定诸如目标单板的操作系统、CPU、工具链等信息。

如何指定这些信息呢,不同的软件可能会有相同。我们如果不熟悉,就需要仔细阅读源码包中附带的诸如README、INSTALL等文件。这些文件会告诉我们,如何指定这些信息。

 

一般来讲,常见的配置方法,是通过 ./configure 命令进行。当然,有些开源包,可能叫./config或其他名字。这并不重要。

 

这些configure通常都是很大的shell脚本,应该都是用自动化工具生成的。因此,我们不用费力去读他的内容。

以opensll为例。配置命令为:

./config--prefix=/opt/arm-linux-gcc-3.4.1/ linux-elf:arm-linux-gcc

这就指定了目标类型是linux-elf,工具链是arm-linux-gcc。

安装路径是:/opt/arm-linux-gcc-3.4.1/。注意,这个路径是交叉工具链include目录及lib目录的父目录。因为头文件及编译后的库文件,需要分别安装到include与lib目录中。

当然,在配置命令中,我们还可以指定其他选项,以做进一步的定制。

一般来讲,可以通过  ./configure  --help 命令查看所支持的可定制选项。

该命令会输出所支持的各种选项,选项的含义,以及默认是否打开等信息。

 

 

当然,对于opensll来说,这里是用./config --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的开源应用程序了。

 

 

三、开源应用程序的移植

假设我们已经获取并解压了开源应用程序的源码包,并且在shell中已经进入了源码包的根目录。接下来的工作,也分三步进行。

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步中,已经指定了安装目录为单板的根文件系统。

makeinstall命令也未必好用,他可能会安装过多的东西(如man手册页等,单板上并不需要),或者某些文件安装的路径未必正确,或者不会安装相
0 0