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

news2025/1/21 9:36:46

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

  • 1 基于debootstrap搭建目标系统环境
    • 1.1 安装必要软件包
    • 1.2 创建sysroot目录
    • 1.3 运行debootstrap
    • 1.4 挂载必要的虚拟文件系统
    • 1.5 进入目标系统
    • 1.6 使用目标系统(以安装zlog为例)
    • 1.7 清理和退出
  • 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 进入目标系统

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

sudo chroot ~/ubuntu-jammy-arm64

1.6 使用目标系统(以安装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.7 清理和退出

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

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.coloradmin.cn/o/2279288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

0.立即chat liji.chat 1.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点&#xff0c;随时封禁不会封禁价格每月140元订阅费用每年70元虚拟卡一天仅需4.88&#xff0c;一月低至48.88随用性需要用时必须开月度订阅可按天周月&#xff…

AI News(1/19/2025):Microsoft AutoGen v0.4:走向更智能 AI 代理的转折点

1、Microsoft AutoGen v0.4&#xff1a;走向更智能 AI 代理的转折点[1] 微软发布的AutoGen v0.4是AI代理领域的一个重要进步。该框架采用异步事件驱动架构&#xff0c;使代理能够并行执行任务&#xff0c;提高任务执行速度和资源利用效率&#xff0c;这对于多代理系统尤为重要…

4. LwIP_网络数据包管理

概述 协议栈的本质&#xff1a; TCP/IP协议栈的实现&#xff0c;本质上就是对数据包的管理。在LwIP中&#xff0c;定义了一个pbuf结构体对数据包进行管理。 pbuf管理数据包的步骤&#xff1a; 1、用户产生要传输的数据 2、用户在内存堆/内存池中申请一个pbuf结构体 3、将…

NPC与AI深度融合结合雷鸟X3Pro AR智能眼镜:引领游戏行业沉浸式与增强现实新纪元的畅想

if… NPC&#xff08;非玩家角色&#xff09;与AI&#xff08;人工智能&#xff09;的深度融合&#xff0c;正引领游戏行业迈向一个全新的沉浸式与增强现实&#xff08;AR&#xff09;相结合的新时代。这一创新不仅预示着游戏体验的质变&#xff0c;更可能全面革新游戏设计与叙…

Redis系列之底层数据结构字典Dict

Redis系列之底层数据结构字典Dict Dict数据结构 Dict是Redis数据结构中使用最为频繁的复合型数据结构&#xff0c;本质上是一个哈希表 查看redis6.0版本的源码&#xff0c;链接&#xff1a;https://github.com/redis/redis/blob/6.0/src/dict.h 哈希表的结构定义&#xff1…

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一&#xff1a;使用 float 普通盒子实现横向布局 方法二&#xff1a;使用 display: inline-block 内联块级元素实现横向布局 方法三&#xff1a;使用弹性盒子 flexbox&#xff0…

Go Map 源码分析(一)

Go语言中的map是通过哈希表实现的&#xff0c;其底层结构和实现机制如下&#xff1a; 一、hash 结构 hmap结构体&#xff1a;是map的头部结构&#xff0c;主要字段及含义如下&#xff1a; count&#xff1a;表示当前哈希表中的元素数量&#xff0c;与len()函数相对应。flags…

【大数据2025】Yarn 总结

分布式资源管理系统讲解总结 一、引言 围绕分布式资源管理系统展开&#xff0c;重点涵盖 Yarn 的简介、原理、资源调度策略以及运维和管理&#xff0c;旨在让学员全面掌握相关知识。Yet Another Resource Negotiator 二、Yarn 诞生背景 在 Hadoop 1.X 中仅有 HDFS 和 MapRe…

【AI日记】25.01.19

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales 读书 书名&#xff1a;自由宪章阅读原因&#xff1a;作者哈耶克&#xff0c;诺贝尔经济学奖得主&#xff0c;之前读过他的 《通往奴役…

5.最长回文子串--力扣

给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示例 2&#xff1a; 输入&#xff1a;s “cbbd” 输出&#xff1a;“bb” 原题如上&…

GCPAAS/DashBoard:完全免费的仪表盘设计,基于Vue+ElementUI+G2Plot+Echarts,开源代码,简单易用!还在等什么呢

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 GCPAAS/DashBoard&#xff0c;一款基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘目录管理…

Linux——线程条件变量(同步)

Linux——多线程的控制-CSDN博客 文章目录 目录 文章目录 前言 一、条件变量是什么&#xff1f; 1、死锁的必要条件 1. 互斥条件&#xff08;Mutual Exclusion&#xff09; 2. 请求和保持条件&#xff08;Hold and Wait&#xff09; 3. 不可剥夺条件&#xff08;No Preemption&…

“AI 辅助决策系统:决策路上的智慧领航员

在当今瞬息万变的时代&#xff0c;无论是企业的运营管理&#xff0c;还是个人在生活中的重大抉择&#xff0c;都需要精准、高效的决策。然而&#xff0c;信息的繁杂和未来的不确定性&#xff0c;常常让决策变得困难重重。这时&#xff0c;AI 辅助决策系统宛如一位智慧的领航员&…

某讯一面,感觉问Redis的难度不是很大

前不久&#xff0c;有位朋友去某讯面试&#xff0c;他说被问到了很多关于 Redis 的问题&#xff0c;比如为什么用 Redis 作为 MySQL 的缓存&#xff1f;Redis 中大量 key 集中过期怎么办&#xff1f;如何保证缓存和数据库数据的一致性&#xff1f;我将它们整理出来&#xff0c;…

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…

闪豆多平台视频批量下载器

1. 视频链接获取与解析 首先&#xff0c;在哔哩哔哩网页中随意点击一个视频&#xff0c;比如你最近迷上了一个UP主的美食制作视频&#xff0c;想要下载下来慢慢学。点击视频后&#xff0c;复制视频页面的链接。复制完成后&#xff0c;不要急着关闭浏览器&#xff0c;因为接下来…

【STM32-学习笔记-14-】FLASH闪存

文章目录 FALSH闪存一、FLASH简介二、FLASH基本结构三、FLASH解锁四、使用指针访问存储器五、FLASH擦除以及编程流程Ⅰ、程序存储器全擦除1. 读取FLASH_CR的LOCK位2. 检查LOCK位是否为13. 设置FLASH_CR的MER 1和STRT 1&#xff08;如果LOCK位0&#xff09;4. 检查FLASH_SR的B…

微信消息群发(定时群发)-UI自动化产品(基于.Net平台+C#)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; 关联源码及工具下载https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/…

FPGA产业全景扫描

随着芯片种类日益丰富、功能日益强大&#xff0c;人们不禁好奇&#xff1a;一块FPGA是如何从最初的概念一步步呈现在我们面前的&#xff1f; FPGA设计、FPGA原型验证/仿真、FPGA板级调试和应用&#xff0c;是FPGA从概念到应用的必经之路。本文将围绕这几个核心环节&#xff0c…