背景

前幾天準備寫OS時一直提示我沒有i686-elf-gcc,使用Ubuntu自帶的apt工具下載卻無法定位該包。

Ubuntu提示Unable to locate package i686-elf-gcc
Ubuntu提示Unable to locate package i686-elf-gcc

而寫OS這種跟底層有關的裸機編程不可以使用原生gcc,于是我便在Ubuntu的倉庫裡面亂翻,試圖翻出些有用的替代品,結果裡面一個和i686-elf-gcc有關係的都沒有。

于是我只好Google了,並且通過一頓查找,搜尋到了在騰訊雲開發者社區的一篇文章:Ubuntu 18.04安装i686-elf交叉编译工具链的方法[通俗易懂]

這個文章雖然講的是在2018年4月發佈的Ubuntu 18.04的方法,但是經過我的實踐,發現這則方法在Ubuntu 24.04也是有用的。

下面則是這則方法的步驟,希望對你們有用也是防止我以後忘了

方法

其實就是手動編譯滿浪費時間的,這是最經典也是最靈活的方法,可以完全控制編譯器的版本和配置

安裝必要的依賴

先打開Terminal,更新一下包列表幾乎所有教程必備的第一步並安裝編譯工具和依賴庫。執行以下命令:

1
2
sudo apt update
sudo apt install build-essential bison flex libgmp3-dev libmpc-dev libmpfr-dev texinfo wget

這些都是編譯binutilsgcc所必備的工具和庫。

下載原始碼

創建一個工作目錄(這裡我選的是~/src)並下載binutilsgcc的原始碼。版本號根據需要選擇,此處以較新的穩定版為example:

1
2
3
4
5
cd ~/src
wget https://ftp.gnu.org/gnu/binutils/binutils-2.42.tar.xz
wget https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz
tar -xf binutils-2.42.tar.xz
tar -xf gcc-14.2.0.tar.xz

設定環境變數

定義目標平臺和安裝前綴,方便後繼操作:

1
2
3
export PREFIX="$HOME/opt/cross"
export TARGET=i686-elf
export PATH="$PREFIX/bin:$PATH"

$HOME/opt/cross設定為安裝路徑,可以保持系統整潔,也便於日後刪除或管理。

編譯安裝Binutils與GCC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cd ~/src
mkdir build-binutils
cd build-binutils
../binutils-2.42/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
make
make install

cd ~/src
# GCC 的依赖脚本会自动下载 GMP、MPFR、MPC 等
cd gcc-14.2.0
./contrib/download_prerequisites
cd ..
mkdir build-gcc
cd build-gcc
../gcc-14.2.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers
make all-gcc
make all-target-libgcc
make install-strip-gcc
make install-strip-target-libgcc

編譯安裝過程會花費一點很多時間,請耐心等待中間可以打會兒galgame什麼的

配置環境變數(永久生效)

為了讓編譯器在任何新Terminal都可以使用,可以講下行加入到你的~/.bashrc(zsh則是/.zshrc)中:

1
export PATH="$HOME/opt/cross/bin:$PATH"

之後執行source ~/.bashrc(zsh則是source /.zshrc)或者重啟Terminal。

搞定。

結尾

其實Archlinux系的AUR倉庫是有i686-elf-gcc包的,如果實在不行也可以轉去Arch(Canonical震怒)

希望能幫到你們,這是我第一次寫技術性部落格。



Copyright © Since 2024 카ミㄚちょ