----背景
一个aarch64的设备中有两个SDK,分别需要使用两种不同gcc版本编译,于是在x86上搭一个方便整体切换的交叉编译环境。环境包括:
- gcc-{$version}
- g+±{$version}
- aarch64-linux-gnu-gcc-{$version}
- aarch64-linux-gnu-g+±{$version}
- cpp-{$version}
使用update-alternatives工具管理,写一个函数放在.zshrc(或者.bashrc)中,用一条命令整体切换环境。
----步骤
1、安装软件(以gcc-10为例)
sudo apt-get install gcc-10 g++-10 cpp-10 gcc-10-aarch64-linux-gnu-base gcc-10-aarch64-linux-gnu g++-10-aarch64-linux-gnu
2、设置update-alternatives
- 设置gcc、g++、aarch64-linux-gnu-gcc-10、aarch64-linux-gnu-g+±10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 20 \
--slave /usr/bin/g++ g++ /usr/bin/g++-10 \
--slave /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-gcc-10 \
--slave /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/aarch64-linux-gnu-g++-10
- 设置cpp
sudo update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-10 20
3、测试设置是否成功
sudo update-alternatives --config gcc
## 以下为输出:
有 4 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。
选择 路径 优先级 状态
------------------------------------------------------------
* 0 /usr/bin/gcc-12 80 自动模式
1 /usr/bin/gcc-10 20 手动模式
2 /usr/bin/gcc-11 60 手动模式
3 /usr/bin/gcc-12 80 手动模式
4 /usr/bin/gcc-9 40 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:1
update-alternatives: 使用 /usr/bin/gcc-10 来在手动模式中提供 /usr/bin/gcc (gcc)
sudo update-alternatives --config cpp
## 以下为输出:
有 5 个候选项可用于替换 cpp (提供 /usr/bin/cpp)。
选择 路径 优先级 状态
------------------------------------------------------------
* 0 /usr/bin/cpp-12 80 自动模式
1 /usr/bin/cpp 10 手动模式
2 /usr/bin/cpp-10 20 手动模式
3 /usr/bin/cpp-11 60 手动模式
4 /usr/bin/cpp-12 80 手动模式
5 /usr/bin/cpp-9 40 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:2
update-alternatives: 使用 /usr/bin/cpp-10 来在手动模式中提供 /usr/bin/cpp (cpp)
4、 写一个函数放在.zshrc
- 打开shell的配置文件
# 用zsh的,输入以下命令
sudo nano ~/.zshrc
# 用bash的,输入一下命令
sudo nano ~/.bashrc
- 在末尾输入以下脚本函数
# 切换 gcc 和 cpp 版本的函数
switch_gcc_cpp() {
# 获取 update-alternatives 管理下的所有 gcc 版本
local options=($(update-alternatives --list gcc))
if [ ${#options[@]} -eq 0 ]; then
echo "没有找到任何由 update-alternatives 管理的 gcc 版本。"
return 1
fi
# 打印选项列表
echo "请选择要使用的 gcc 版本:"
for i in "${options[@]}"; do
local version=$(basename "$i")
echo " ${options[(i)$i]-1}) $version"
done
# 用户选择
echo -n "请输入编号: "
read choice
# 检查输入是否为数字以及是否在范围内
if [[ ! "$choice" =~ ^[0-9]+$ ]] || (( choice < 0 || choice > ${#options[@]} )); then
echo "无效的选择。"
return 1
fi
local selected_gcc=${options[$choice]}
#local selected_version=$(basename "$selected_gcc")
local selected_version=${selected_gcc##*gcc-}
# echo -n "The selected_gcc is $selected_gcc"
# echo -n "The selected_version is $selected_version"
# 切换 gcc 和 cpp
sudo update-alternatives --set gcc "$selected_gcc"
sudo update-alternatives --set cpp "/usr/bin/cpp-$selected_version"
# 如果有对应的交叉编译工具链也一并切换
# if [ -e "/usr/bin/aarch64-linux-gnu-gcc-$selected_version" ]; then
# sudo update-alternatives --set aarch64-linux-gnu-gcc "/usr/bin/aarch64-linux-gnu-gcc-$selected_version"
# sudo update-alternatives --set aarch64-linux-gnu-g++ "/usr/bin/aarch64-linux-gnu-g++-$selected_version"
# sudo update-alternatives --set aarch64-linux-gnu-cpp "/usr/bin/aarch64-linux-gnu-cpp-$selected_version"
# fi
echo "已成功切换到 gcc 和 cpp 版本 $selected_version。"
}
- 生效配置
source ~/.zshrc # or .bashrc, depend on your shell
- 测试
(base) ~/ switch_gcc_cpp
请选择要使用的 gcc 版本:
1) gcc-10
2) gcc-11
3) gcc-12
4) gcc-9
请输入编号: 1
已成功切换到 gcc 和 cpp 版本 10。