欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 10:33:46
...

在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-进行编译。