arm-linux-gcc交叉编译环境搭建

arm-linux-gcc交叉编译环境搭建

    • 1、PC端下载编译工具
    • 2、上传交叉编译工具至ubuntu中

1、PC端下载编译工具

这里下载arm-linux-gnueabihf-gcc(关于区别:交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
"交叉编译器”(cross compiler),用作跨平台来编译程序!做交叉编译器要弄清楚3个概念:host, build, target:

  • build 你在什么平台上编译的这个编译器
  • host 这个编译器将来要在什么平台上运行
  • target 编译器最终会生成在哪个平台上执行的可执行代码
    参考

2、上传交叉编译工具至ubuntu中

比如直接下载到/home/xx/Downloads/
在此文件夹中打开终端terminal

#解压并将解压的包移动到/opt/下
tar -xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar
sudo mv gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux /opt/gcc-linaro-arm-linux-gnueabihf

配置环境变量PATH

Ubuntu不同目录下profile与bashrc的区别

/etc/profile 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。

/etc/bash.bashrc 为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。

~/.bash_profile 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

~/.bashrc 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。

~/.bash_logout 当每次退出系统(退出bash shell)时,执行该文件。

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系。

~/.bash_profile 是交互式、login 方式进入 bash 运行的。

~/.bashrc 是交互式 non-login 方式进入 bash 运行的。

通常二者设置大致相同,所以通常前者会调用后者。

1)编辑bash.bashrc文件

sudo gedit /etc/bash.bashrc

2)在文件中添加变量

export PATH=$PATH:/opt/gcc-linaro-arm-linux-gnueabihf/bin

3)更新环境变量

source /etc/bash.bashrc

运行arm-linux-gnueabihf-gcc-v
出现:
bash: /usr/local/arm/ gcc-linaro-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-gcc:No such file or directory错误,安装32位兼容包解决该问题

最好使用:安装依赖库所需软件 sudo apt-get install aptitude不用apt-get install
使用sudo aptitude install libxxx
sudo apt-get install lib32ncurses5 lib32z1
sudo aptitude install lib32ncurses5 lib32z1

PS:我的是ubuntu18.04直接使用sudo apt install arm-linux-gnueabihf-gcc安装后,重启ubuntu即可编译(不用以上两步!)。
以下是在线安装的方式:

sudo apt install arm-linux-gnueabihf-gcc

#其他版本的在线安装方式如下:
#查看哪些版本可以安装;
sudo apt-cache search aarch64

 #安装一个gcc开头的5版本的支持64bit ARM linux的交叉编译工具;
sudo apt install gcc-5-aarch64-linux-gnu
sudo apt install g++-5-aarch64-linux-gnu

 #然后再安装一个没有版本号的gcc-aarch64-linux-gnu;
sudo apt-get install gcc-aarch64-linux-gnu

以上步骤是安装支持ARM64位系统的交叉编译工具,安装之后,用
aarch64-linux-gnu-gcc -v可以查看里边的版本信息,里边有host是什么,target是什么

卸载方式:

sudo apt-get -y remove arm-linux-gnueabihf-gcc #-----(package 删除包)
sudo apt-get purge arm-linux-gnueabihf-gcc # ----(package 删除包,包括删除配置文件等) 
sudo apt-get -y autoremove #卸载不需要的依赖关系
sudo apt-get -y autoclean #清理安装软件时留下的缓存程序软件包/只清理过时的包
sudo apt-get -y clean #清理下载文件的存档

arm-linux-gcc交叉编译环境搭建_第1张图片

链接器ld的选项有 -L,-rpath 和 -rpath-link

-L: “链接”的时候,去找的目录,也就是所有的 -lFOO 选项里的库,都会先从
-L 指定的目录去找,然后是默认的地方。编译时的-L选项并不影响环境变量LDLIBRARYPATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,系统还是会到默认路径下查找该程序所需要的库,如果找不到,还是会报错,类似cannot open shared object file。

-rpath-link:这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。

-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,交叉编译链接器需已经配置 --with-sysroot 选项才能起作用。也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时查找需要加载的动态库。-rpath-link 则只用于链接时查找

参考

交叉编译的常见问题:
arm-linux-gcc交叉编译环境搭建_第2张图片
处理:
使用绝对路径进行编译,或者使用su命令切换到root不改变环境变量尝试解决,如果你使用了source 某个环境变量这样是无效的,只有使用绝对路径处理

END!

你可能感兴趣的:(Ubuntu,交叉编译工具)