如果你想在樹莓派、開發板、嵌入式設備上執行自己的程式,卻發現:
-
系統不能直接編譯
-
沒有 GCC
-
沒有 Make
-
甚至連標頭檔都缺一堆
那麼,你就需要學會一項重要技能:交叉編譯(Cross Compilation)。
**交叉編譯是嵌入式開發、低功耗系統開發者必備的基礎技術,**本篇將用最清晰的方式告訴你:
-
什麼是交叉編譯
-
工具鏈怎麼準備
-
實際怎麼用
-
遇到錯誤怎麼解
一、什麼是交叉編譯?
交叉編譯就是在一個平台上(開發機)為另一個平台(目標機)產生可執行檔案的過程。
常見情況像是:
-
在 Ubuntu 桌機上編譯給 Raspberry Pi(ARM)
-
在 x86 系統上編譯給 STM32(Cortex-M)
-
在 macOS 上編譯給嵌入式 Linux 裝置
這種異架構下的編譯行為,就叫做交叉編譯。
二、交叉編譯器工具鏈是什麼?
常見工具鏈(Toolchain)通常包含:
-
編譯器(
gcc,g++) -
連結器(
ld) -
標頭檔與庫(glibc, uClibc)
-
GDB 等除錯工具(選配)
常見的交叉編譯器:
| 平台 | 工具鏈名稱 |
|---|---|
| ARM 32-bit | arm-linux-gnueabihf-gcc |
| ARM 64-bit | aarch64-linux-gnu-gcc |
| Cortex-M | arm-none-eabi-gcc |
| RISC-V | riscv64-unknown-elf-gcc |
三、實作:交叉編譯 Hello World
假設你要為 Raspberry Pi 編譯一個 C 程式:
程式碼:hello.c
#include <stdio.h>
int main() {
printf("Hello from ARM!\n");
return 0;
}
使用交叉編譯器:
aarch64-linux-gnu-gcc -o hello hello.c
這樣產生的 hello 執行檔,就能在 64 位元的 Raspberry Pi OS 上執行。
四、確認產出的執行檔平台
file hello
輸出會像這樣:
ELF 64-bit LSB executable, ARM aarch64, ...
如果出現 x86,代表你可能用了錯誤的編譯器。
五、交叉編譯 Makefile 怎麼寫?
CC = arm-linux-gnueabihf-gcc
CFLAGS = -O2
all: app
app: main.o
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o app
只要換一行 CC = ...,你就能切換不同架構的目標。
六、交叉編譯常見錯誤與排除
錯誤:找不到標頭檔
解法: 指定目標系統的 sysroot 或 include 路徑
錯誤:無法連結標準庫
解法: 安裝目標平台對應的 glibc-dev 套件,或指定完整路徑
錯誤:程式無法在板子上執行
解法: 確認架構、位元數是否一致,並檢查相依庫是否齊全
七、結語:交叉編譯,是你進入嵌入式開發的起點
如果你未來想做:
-
ARM 系統開發
-
Linux 開發板專案(如 Buildroot、Yocto)
-
開源韌體編譯(如 OpenWRT、uBoot)
-
甚至是編譯你自己的 Linux Kernel
那麼,交叉編譯就是你繞不過去的一關。
先從 Hello World 開始,慢慢熟悉工具鏈,再一步步搭建屬於你自己的開發平台!
評論