基于VSCode+CMake+debootstrap搭建Ubuntu交叉编译开发环境

基于VSCode+CMake+debootstrap搭建Ubuntu交叉编译开发环境

  • [1 基于debootstrap搭建目标系统环境](#1 基于debootstrap搭建目标系统环境)
    • [1.1 安装必要软件包](#1.1 安装必要软件包)
    • [1.2 创建sysroot目录](#1.2 创建sysroot目录)
    • [1.3 运行debootstrap](#1.3 运行debootstrap)
    • [1.4 挂载必要的虚拟文件系统](#1.4 挂载必要的虚拟文件系统)
    • [1.5 复制 QEMU 静态二进制文件](#1.5 复制 QEMU 静态二进制文件)
    • [1.6 进入目标系统](#1.6 进入目标系统)
    • [1.7 使用目标系统(以安装zlog为例)](#1.7 使用目标系统(以安装zlog为例))
    • [1.8 清理和退出](#1.8 清理和退出)
  • [2 基于VSCode+CMake搭建交叉编译环境](#2 基于VSCode+CMake搭建交叉编译环境)
    • [2.1 安装CMake](#2.1 安装CMake)
    • [2.2 安装交叉编译工具链](#2.2 安装交叉编译工具链)
    • [2.3 安装VSCode](#2.3 安装VSCode)
    • [2.4 创建示例项目](#2.4 创建示例项目)

1 基于debootstrap搭建目标系统环境

ubuntu22.04-amd64为主机系统,以ubuntu22.04-arm64(aarch64)系统作为目标系统,在主机中搭建一个虚拟的目标设备,以使用真实目标设备的方式来使用该虚拟目标设备,在其中安装依赖库,为交叉编译提供支持。

1.1 安装必要软件包

确保主机已经安装了 debootstrap, qemu-user-staticbinfmt-support 工具

复制代码
sudo apt update
sudo apt install debootstrap qemu-user-static binfmt-support

1.2 创建sysroot目录

我们需要为新的根文件系统创建一个工作目录。这里我们选择 ~/ubuntu-jammy-arm64 作为 sysroot 的位置。

复制代码
sudo mkdir ~/ubuntu-jammy-arm64

1.3 运行debootstrap

使用 debootstrap 下载并解压基本的 Ubuntu 22.04 (代号 jammy) 软件包到指定的目标文件夹中。由于我们要针对 ARM64 架构进行操作,因此需要指定 --arch=arm64 参数,并且提供一个适合 ARM 架构的镜像源地址。

复制代码
sudo debootstrap --arch=arm64 jammy ~/ubuntu-jammy-arm64 http://mirrors.ustc.edu.cn/ubuntu-ports/

1.4 挂载必要的虚拟文件系统

实际测试发现,这一步并非必须。为了方便,可以省略挂载过程,在出现问题时再进行挂载即可。

复制代码
sudo mount --bind /proc ~/ubuntu-jammy-arm64/proc
sudo mount --bind /sys ~/ubuntu-jammy-arm64/sys
sudo mount --bind /dev ~/ubuntu-jammy-arm64/dev
sudo mount --bind /dev/pts ~/ubuntu-jammy-arm64/dev/pts

1.5 复制 QEMU 静态二进制文件

复制代码
sudo cp /usr/bin/qemu-aarch64-static ~/ubuntu-jammy-arm64/usr/bin/

1.6 进入目标系统

在主机系统中可以输入一下命令来进入目标系统

复制代码
sudo chroot ~/ubuntu-jammy-arm64

1.7 使用目标系统(以安装zlog为例)

从github下载zlog的最新release版本,(此处为zlog-1.2.18.tar.gz),拷贝到目标系统的某一目录下(此处为/home/workspace,对应于主机系统的 ~/ubuntu-jammy-arm64/home/workspace
https://github.com/HardySimpson/zlog/releases

复制代码
# 进入目标系统
# sudo chroot ~/ubuntu-jammy-arm64

安装必要的构建工具

复制代码
apt update
apt install build-essential

编译和安装zlog

复制代码
# 创建和进入工作空间目录
mkdir /home/workspace
cd /home/workspace
# 解压源码
tar -zxvf zlog-1.2.18.tar.gz
cd zlog-1.2.18
# 编译
make
# 安装
make install
# 刷新动态l链接器,使程序可以找到zlog
ldconfig

测试zlog,创建目录/home/workspace/test-zlog

在该目录下创建源文件main.c

复制代码
// main.c

#include <stdio.h> 
#include "zlog.h"

int main(int argc, char** argv)
{
    int rc;
    zlog_category_t *c;

    rc = zlog_init("./zlog.conf");
    if (rc) {
    printf("init failed\n");
    return -1;
    }

    c = zlog_get_category("my_cat");
    if (!c) {
    printf("get cat fail\n");
    zlog_fini();
    return -2;
    }

    zlog_info(c, "hello, zlog");

    zlog_fini();

    return 0;
}

在该目录下创建配置文件zlog.conf

复制代码
# zlog.conf

[formats]
simple = "%m%n"
[rules]
my_cat.DEBUG    >stdout; simple

编译项目

复制代码
gcc -o main main.c -lzlog

执行

复制代码
./main
# hello, zlog

1.8 清理和退出

在目标系统中输入一下命令可以返回到主机系统

复制代码
exit

若已经挂载了文件系统,需要在主机系统中取消挂载

复制代码
sudo umount ~/ubuntu-jammy-arm64/{proc,sys,dev/pts,dev}

2 基于VSCode+CMake搭建交叉编译环境

在主机中基于虚拟目标设备搭建交叉编译开发环境

2.1 安装CMake

复制代码
sudo apt update
sudo apt install cmake
# 验证安装
cmake --version

2.2 安装交叉编译工具链

复制代码
sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu # AArch64 (64-bit)

2.3 安装VSCode

从官网下载安装包
https://code.visualstudio.com/

复制代码
sudo dpkg -i code_1.96.4-1736991114_amd64.deb 

安装相关插件

  • C/C++ Extension Pack(必须)
  • Chinese (Simplified)(可选,中文显示)
  • Better Comments(可选,注释优化)
  • GitHub Copilot(可选,AI辅助)

2.4 创建示例项目

使用VSCode建立项目结构如下(~/workspace/demo

├── demo

├── CMakeLists.txt

├── main.c

其中,main.c内容与上文一致,CMakeLists.txt内容如下

复制代码
# 设置CMake最低版本
cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(demo C)

# 设置C标准
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)

# 设置目标系统
set(CMAKE_SYSTEM_NAME Linux)

# 设置目标架构
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 设置目标系统根目录
set(CMAKE_SYSROOT ~/ubuntu-jammy-arm64)
message("CMAKE_SYSROOT: ${CMAKE_SYSROOT}")

# 指定交叉编译器路径
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
message(STATUS "C Compiler: ${CMAKE_C_COMPILER}")
message(STATUS "C Compiler ID: ${CMAKE_C_COMPILER_ID}")
message(STATUS "C Compiler Version: ${CMAKE_C_COMPILER_VERSION}")
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER}")
message(STATUS "C++ Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
message(STATUS "C++ Compiler Version: ${CMAKE_CXX_COMPILER_VERSION}")

# 只在目标系统目录中查找库
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)

# zlog
# 库文件
find_library(ZLOG_LIBRARY 
    NAMES zlog
)
if (ZLOG_LIBRARY)
    message(STATUS "Found zlog library at: ${ZLOG_LIBRARY}")
else()
    message(FATAL_ERROR "zlog library not found")
endif()
# 头文件
find_path(ZLOG_INCLUDE_DIR zlog.h)
if (ZLOG_INCLUDE_DIR)
    message(STATUS "Found zlog.h at: ${ZLOG_INCLUDE_DIR}")
else()
    message(FATAL_ERROR "zlog.h not found")
endif()

# 包含头文件
include_directories(
    ${ZLOG_INCLUDE_DIR}
)

# 添加可执行文件
add_executable(${PROJECT_NAME} main.c)

# 添加链接库
target_link_libraries(${PROJECT_NAME} ${ZLOG_LIBRARY})

编译项目

复制代码
mkdir build && cd build
cmake ..
make

将编译出的可执行文件demo复制到目标系统中

复制代码
 sudo cp ~/workspace/demo/build/demo ~/ubuntu-jammy-arm64/home/workspace/test-zlog/

如上文,该目录下已经存在合适的zlog配置文件,进入目标系统执行demo

复制代码
.sudo chroot ~/ubuntu-jammy-arm64/
cd /home/workspace/test-zlog/
./demo
# hello, zlog
相关推荐
Silence4Allen1 小时前
Ubuntu 安装WPS Office
linux·ubuntu·wps
Aspiring Q2 小时前
vscode+keil嵌入式软件开发全流程
vscode·stm32·单片机
百锦再3 小时前
Android Studio 实现自定义全局悬浮按钮
android·java·ide·app·android studio·安卓
百锦再3 小时前
Android Studio 项目文件夹结构详解
android·java·ide·ios·app·android studio·idea
妙为5 小时前
visual studio 2022更改项目名称,灾难性故障(异常来自HRESULT)
ide·visual studio·更改项目名称·hresult·灾难性故障
不是AI7 小时前
【安卓开发】【Android Studio】Menu(菜单栏)的使用及常见问题
android·ide·android studio
MobiCetus8 小时前
Linux Kernel 9
java·linux·运维·服务器·windows·ubuntu·gnu
卷不动的打工仔8 小时前
Ubuntu利用docker搭建Java相关环境记录(二)
java·ubuntu·docker
卷不动的打工仔9 小时前
Ubuntu利用docker搭建Java相关环境问题记录
java·ubuntu·docker
百锦再9 小时前
Android Studio 中文字大小的单位详解
android·xml·java·ide·app·android studio