当前位置: 首页 > article >正文

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

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

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

http://www.kler.cn/a/511551.html

相关文章:

  • Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽
  • 【玩转全栈】----Django模板的继承
  • VLAN基础理论
  • 利用Ai,帮我完善了UsbCamera App的几个界面和设置功能
  • 吴恩达深度学习——神经网络介绍
  • 网络安全 | 什么是正向代理和反向代理?
  • 电子电气架构 --- ECU故障诊断指南
  • LeetCode 题目 2545. 根据第 K 场考试的分数排序
  • Yii框架中的数据提取:从不同数据源获取数据
  • GoLang教程002:Go语言中的变量声明
  • Flutter+vsCode 安装问题记录
  • python怎么搞定输入??
  • 【Linux】Linux命令:ifconfig
  • Java 基于 SpringBoot+Vue 的校园数字化图书馆(源码+部署+文档)
  • 电梯系统的UML文档06
  • 从单机到集群:Docker、Kubernetes 与 Helm 部署 Redis 全攻略
  • Cyber Security 101-Offensive Security-SQLMap: The Basics(sqlmap基础)
  • 2024年博客成长记:成就、挑战与未来展望
  • 【AIGC】SYNCAMMASTER:多视角多像机的视频生成
  • 毕业就业信息|基于Vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)
  • apisix的authz-casbin
  • 【专题三:穷举vs暴搜vs深搜vs回溯vs剪枝】46. 全排列
  • Nginx关于servername配置无效的处理
  • PDF工具箱 PDF24 ,免费下载,非常好用
  • Spring Boot中的条件注解是如何工作的
  • 基于springboot+sureness的面向REST API资源无状态认证权限管理系统的后端