交叉编译入门指南

声明

本文为本人原创,未经授权严禁转载。如需转载需要在文章最前面注明本文原始链接。

什么是编译

前置学习: 编译入门指南

什么是交叉编译

交叉编译(Cross compilation)是指在一台计算机上生成可在不同平台或操作系统上运行的目标代码的过程。通常情况下,编译器和目标平台的架构是相互匹配的,但交叉编译允许我们在一种平台上开发和编译代码,然后将其移植到另一种平台上运行。
HOST: 编译平台
TARGET:目标运行平台
交叉编译主要用于以下情况:

  1. 开发人员希望在一台计算机上编写代码,并将其部署到不同的硬件平台上,而不需要在每个平台上都安装开发环境。
  2. 开发人员希望针对嵌入式设备或其他特定平台进行编程,而不是使用通用的开发工具。
  3. 开发人员希望利用更强大的计算机资源来加快编译过程,以提高开发效率。

在进行交叉编译时,我们需要使用适用于目标平台的交叉编译工具链,该工具链包含与目标平台兼容的编译器、链接器和库等工具。通过配置适当的工具链和编译选项,我们可以生成与目标平台兼容的可执行文件或库。

交叉编译器 : 用于交叉编译的编译器。

交叉编译配置

test.c

#include <stdio.h>
int main()
{
	printf("hello world\n");
	return 0;
}

makefile

	riscv64-unknown-linux-gnu-gcc test.c -o test

cmake

cmake_minimum_required(VERSION 3.22)

project(HelloWorld VERSION 1.0)

add_executable(HelloWorld test.c)

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_CXX_STANDARD_REQUIRED True)

# 设置交叉编译工具链
set(COMPILER_PREFIX riscv64-unknown-linux-gnu-)
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}g++)

拆分cmake

riscv.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv64)
set(CMAKE_SYSTEM_VERSION 5.19)
set(tools /opt/riscv-gnu-toolchain)
set(CMAKE_SYSROOT ${tools}/sysroot)
set(PREFIX ${tools}/bin/riscv64-unknown-linux-gnu-)
set(CMAKE_C_COMPILER ${PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${PREFIX}g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

CMakeLists.txt

cmake_minimum_required(VERSION 3.22)

project(HelloWorld VERSION 1.0)

add_executable(HelloWorld test.c)

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_CXX_STANDARD_REQUIRED True)

# 设置交叉编译工具链
# set(COMPILER_PREFIX riscv64-unknown-linux-gnu-)
# set(CMAKE_C_COMPILER ${COMPILER_PREFIX}gcc)
# set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}g++)

include(riscv.cmake)

co-server

以下面的项目为例介绍交叉编译在项目中的应用
https://github.com/riscv-keystone-enclave/co-server

交叉编译实践

交叉编译第三方库for riscv

交叉编译交叉编译器

交叉编译之为RISC v平台编译x86的gcc

请 Ta 喝咖啡 ☕️