一、前言
这两天接到的两个关于Linux 平台相关的项目,一个Linux 桌面平台的工具开发,另一个是与客户使用的ARM 平台相关的工具编写。客户环境为三星 ARM 平台Linux 环境,因而需要我们公司提供arm 平台动态库给他们。于是,这个项目落在我的身上,好久没有编写过ARM平台相关的东西。因此,写下这篇文章,记录我使用Ubuntu 安装交叉编译工具<arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz>,编写使用交叉编译工具编写动态库过程。
二、开发环境:
Linux: Ubuntu 16.04 64位桌面版
交叉编译工具:arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz
三、安装交叉编译工具
3.1 将arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz 从共享文件夹中,复制的home/tool 目录下,如图:
进入tool目录,解压解压:arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz,得到 4.9.3 目录
执行如下命令:tar xvJf
arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz
3.2 依据传统,^_^ 在 /usr/local/ 新建一个 名称为 arm 目录,然后将 4.9.3 目录及目录下所有文件拷贝到arm 目录下,如:
cp -rf /4.9.3 /usr/local/arm/ , 进入arm 目录,可以看到4.9.3 目录。
3.3 配置Linux 系统环境变量,在 ~/.bashrc 最后一行添加,环境变量代码,如下,
vim ~/.bashrc
3.3.1 使用vim 打开bashrc , 进入文件最后一行,添加如下代码:
PATH=$PATH:/usr/local/arm/4.9.3/bin/
export PATH
3.3.2 重启登录即可使用交叉编译工具,于是交叉编译工具安装配置完毕。
四、测试安装的交叉编译工具是否安装成功
4.1 检测交叉编译工具是否安装成功并且环境变量是否配置正确,可以使用如下方法测试:
4.1.1 查看gcc 编译版本,即可,使用如下命令:
arm-cortexa9-linux-gnueabihf-gcc -v
显示如下信息,则为安装成功。
五、编写程序helloworld.c 程序验证arm-linux-gcc 是否可以使用
5.1.1 使用gcc helloworld.c -o helloworld 命令编译通过,代码没有问题,
5.2.1 将gcc 换成,arm-cortexa9-linux-gnuebinf-gcc
arm-cortexa9-linux-gnuebinf-gcc helloworld.c -o helloworld ,发现出现如下致命错误:
arm-cortexa9-linux-gnueabihf-gcc: fatal error: -fuse-linker-plugin, but liblto_plugin.so not found
compilation terminated.
在度娘找了半天,任然没有发现问题的解决办法,好像没有人遇到过。o(╥﹏╥)o
o(╥﹏╥)o ,是不是系统太老呢,(因为上一个项目是在Ubuntu 12.04 下开发的,因此,这个项目也是一样使用12.04),于是换个Ubuntu 17.04 系统看试一下,结果发现还是一样,出现这个问题。
研究,别人安装交叉编译工具的流程,发现都是这样子的,没有什么不同,安装完后,查看arm-cortexa9-linux-gnuebinf-gcc -v
都是可以看的到版本信息。这就奇怪了,╮(╯▽╰) ╭╮(╯▽╰)╭
后来,偶然间发现上面的交叉编译工具是2016年出来的,会不会与Ubuntu 环境,有关系。抱着试试的态度,我又安装了一个Ubuntu 16.04 系统,然后按着步骤安装交叉编译工具,然后执行arm-cortexa9-linux-gnuebinf-gcc helloworld.c -o helloworld
没有报错,正常通过。o(╥﹏╥)o o(╥﹏╥)o 好像与Linux 版本有关系,为什么网上就没有人遇到过呢??????
开源项目虽好,但是兼容性太差了,差了一个版本就不能用,这也太坑了。╮(╯▽╰)╭
六、使用arm-cortexa9-linux-gnuebinf-gcc 编译动态库
6.1 编写MakeFile 和源代码。
执行使用gcc make 导出.so , 正常运行,如下图:
6.2 将MakeFILE 中gcc 该成arm-cortexa9-linux-gnueabihf-gcc
make 导出.so 出现如下错误,
strip: Unable to recognise the format of the input file `libicmmodule.so'
Makefile:24: recipe for target 'libicmmodule.so' failed
make: *** [libicmmodule.so] Error 1
发现,原来是Makefile 中使用strip 去除和剥掉一些符号信息和调试信息时报错,进入MakeFile 发现,没有将gcc 下的strip,修改成arm-cortexa9-linux-gnueabihf-gcc 对应的 arm-linux-strip 。
修改Makefile文件,
重新make ,成功,O(∩_∩)O哈哈~。
好了,终于写完了这篇文章了,对于小白的我,写下这篇文章还是非常有必要的,防止下次项目又会遇到,好记忆不如烂笔头。
半夜12点了,睡觉了。(¦3[▓▓] 晚安。