Debian系统使用GCC进行跨平台编译的方法
交叉编译的核心是安装目标平台对应的工具链。Debian通过APT包管理器提供常用工具链,可根据目标架构选择:
gcc-arm-linux-gnueabi(软浮点)或gcc-arm-linux-gnueabihf(硬浮点,推荐用于带浮点硬件的ARM设备);gcc-mips-linux-gnu;gcc-powerpc-linux-gnu。sudo apt update
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
为简化工具链调用,需将交叉编译器路径添加到PATH环境变量。以ARM工具链为例:
export PATH=$PATH:/usr/bin/arm-linux-gnueabihf
建议将上述命令添加到~/.bashrc或~/.profile文件中,实现每次登录自动生效。
创建Makefile文件,明确指定交叉编译器及编译选项。示例如下:
# 定义交叉编译器
CC = arm-linux-gnueabihf-gcc
CXX = arm-linux-gnueabihf-g++
AR = arm-linux-gnueabihf-ar
LD = arm-linux-gnueabihf-ld
# 编译选项:开启警告、优化级别2
CFLAGS = -Wall -O2
CXXFLAGS = -Wall -O2
# 目标程序名称
TARGET = myapp
# 源文件列表
SRCS = main.c utils.c
OBJS = $(SRCS:.c=.o)
# 默认目标
all: $(TARGET)
# 链接目标文件生成可执行文件
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^
# 编译源文件为目标文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 清理生成的文件
clean:
rm -f $(OBJS) $(TARGET)
运行make命令即可启动交叉编译。
若项目使用CMake,需创建toolchain.cmake文件指定工具链路径,再配置CMakeLists.txt。示例如下:
# 设置交叉编译器
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
# 设置目标系统(可选)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
cmake_minimum_required(VERSION 3.10)
project(myapp)
add_executable(myapp main.c)
编译命令:
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
make
make或cmake+make),生成的目标文件将适配目标平台。file命令检查生成的可执行文件,确认为目标平台架构。示例如下:file myapp
# 输出示例:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, for GNU/Linux 3.2.0
sudo apt install qemu-user-static
运行交叉编译后的程序:qemu-arm-static ./myapp
# 目标设备:启动GDB服务器(监听1234端口)
arm-linux-gnueabihf-gdbserver :1234 ./myapp
# 主机端:连接至目标设备
arm-linux-gnueabihf-gdb ./myapp
(gdb) target remote localhost:1234