这里下载arm-linux-gnueabihf-gcc
(关于区别:交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
"交叉编译器”(cross compiler),用作跨平台来编译程序!做交叉编译器要弄清楚3个概念:host, build, target:
比如直接下载到/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 #清理下载文件的存档
链接器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 则只用于链接时查找
参考
交叉编译的常见问题:
处理:
使用绝对路径进行编译,或者使用su命令切换到root不改变环境变量尝试解决,如果你使用了source 某个环境变量这样是无效的,只有使用绝对路径处理
END!