【科技友瘋狂】交叉編譯入門教學:讓你的程式在別的硬體上跑起來!

關鍵字 :全端工程師修煉日記交叉編譯ARMgcc嵌入式開發

如果你想在樹莓派、開發板、嵌入式設備上執行自己的程式,卻發現:

  • 系統不能直接編譯

  • 沒有 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 開始,慢慢熟悉工具鏈,再一步步搭建屬於你自己的開發平台!

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論