基于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
相关推荐
Kasen's experience4 分钟前
Ubuntu 24.04 LTS 安装 tailscale 并访问 SMB共享文件夹
linux·ubuntu·tailscale
转角人生17 分钟前
查看jar包,被哪些地方引用,并排包
java·ide·intellij-idea
Major_pro1 小时前
Vscode:问题解决办法 及 Tips 总结
ide·vscode·编辑器
etudou4 小时前
vscode环境中用仓颉语言开发时调出覆盖率的方法
ide·vscode·编辑器·仓颉·cangjie
源之缘-OFD先行者4 小时前
TypeScript 使用 VSCode 简介
javascript·vscode·typescript
monstercl6 小时前
【服务器】Ubuntu22.04配置静态ip
linux·运维·服务器·tcp/ip·ubuntu
敖行客 Allthinker7 小时前
云IDE:开启软件开发的未来篇章
ide
牛马大师兄10 小时前
网络编程 | UDP套接字通信及编程实现经验教程
linux·网络·网络协议·ubuntu·udp
davenian11 小时前
< OS 有关 > 阿里云:轻量应用服务器 的使用 安装 Tailscale 后DNS 出错, 修复并替换 apt 数据源
linux·服务器·ubuntu·阿里云·tailscale