基于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.rhkb.cn/news/4642.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql查看binlog日志

mysql 配置、查看binlog日志&#xff1a; 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启&#xff0c;修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin&#xff08;开启日志并指定日志前缀&#xff…

【QT】 控件 -- 按钮类(Button)

&#x1f525; 目录 1. 前言 2. Push Button 按钮 1、带有图标的按钮 -- 纯代码实现2、带有快捷键的按钮 -- 图形化&代码实现 3、按钮的重复触发 3. Radio Button 按钮 **1. click、press、release、toggled 的区别** **2. 单选框分组** 4. Check Box 复选 5. Tool Butto…

postman请求参数化

postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…

在 Babylon.js 中使用 Gizmo:交互式 3D 操作工具

在 3D 应用程序中&#xff0c;交互式操作对象&#xff08;如平移、旋转、缩放&#xff09;是一个常见的需求。Babylon.js 提供了一个强大的工具——Gizmo&#xff0c;用于在 3D 场景中实现这些功能。本文将介绍如何在 Babylon.js 中使用 Gizmo&#xff0c;并展示如何通过代码实…

虚幻商城 Fab 免费资产自动化入库

文章目录 一、背景二、实现效果展示三、实现自动化入库一、背景 上一次写了个这篇文章 虚幻商城 Quixel 免费资产一键入库,根据这个构想,便决定将范围扩大,使 Fab 商城的所有的免费资产自动化入库,是所有!所有! 上一篇文章是根据下图这部分资产一键入库: 而这篇文章则…

Ubuntu 22.04.5 修改IP

Ubuntu22.04.5使用的是netplan管理网络&#xff0c;因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改&#xff0c;需要权限&#xff0c;使用sudo vim或者其他编辑器&#xff0c;修改后的内容如下&#xff1a; # Let NetworkManager manage all devices on …

通过学习更多样化的生成数据进行更广泛的数据分发来改进实例分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 本次使用的英文整理的一些记录&#xff0c;练习一下为后续SCI发表论文打好基础 Improving Instance Segmentation by Learning Wider Data Distribution with More Diverse Generative Data Abstract In…

写作利器:如何用 PicGo + GitHub 图床提高创作效率

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

通过Ukey或者OTP动态口令实现windows安全登录

通过 安当SLA&#xff08;System Login Agent&#xff09;实现Windows安全登录认证&#xff0c;是一种基于双因素认证&#xff08;2FA&#xff09;的解决方案&#xff0c;旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤&#xff1a; 1. 安当SLA的核心功能 安…

基于Python的多元医疗知识图谱构建与应用研究(上)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…

疑难Tips:解决 SQL*Plus 中工具插入中文数据到Oracle数据库报错及乱码问题

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 原文地址&#xff1a;疑难Tips&#xff1a;解决 SQL*Plus 中工具插入中文数据到Oracle数据库报错及乱码问题在SQL*Plus执行插入语句中含有中文时&#xff0c;出现ORA-01756错误和乱码。这两个问题…

Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL

前言&#xff1a; 有许多开发的小伙伴&#xff0c;使用的是mac&#xff0c;那么在mac上如何安装&#xff0c;配置Mysql&#xff0c;以及使用Mysql了&#xff0c;今天来一个系统的教程。 安装Mysql 使用mysql前&#xff0c;我们需要先下载mysql&#xff0c;并按照以下几个步骤…

iOS中的设计模式(三)- 工厂方法

引言 几乎在每个用面向对象语言开发的应用程序中&#xff0c;都能见到工厂方法模式的身影。它是 抽象工厂模式 的核心组成部分。通过重载抽象工厂父类中定义的工厂方法&#xff0c;各种具体工厂能够创建属于自己的对象。 在工厂方法模式中&#xff0c;生产者 本身并不一定是抽…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状&#xff0c;关键技术 创新方向&#xff0c;以及行业应用的具体情况&#xff0c;通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

Unity Shader学习日记 part5 CG基础

在了解完Shader的基本结构之后&#xff0c;我们再来看看编写着色器的语言。 Shader编写语言有CG&#xff0c;HLSL两种&#xff0c;我们主要学习CG的写法。 数据类型 CG的基础变量类型 uint a12;//无符号32位整形 int b12;//32位整形float f1.2f;//32位浮点型 half h1.2h;//…

AI Agent:深度解析与未来展望

一、AI Agent的前世&#xff1a;从概念到萌芽 &#xff08;一&#xff09;早期探索 AI Agent的概念可以追溯到20世纪50年代&#xff0c;早期的AI研究主要集中在简单的规则系统上&#xff0c;这些系统的行为是确定性的&#xff0c;输出由输入决定。随着时间的推移&#xff0c;…

【24】Word:小郑-准考证❗

目录 题目 准考证.docx 邮件合并-指定考生生成准考证 Word.docx 表格内容居中表格整体相较于页面居中 考试时一定要做一问保存一问❗ 题目 准考证.docx 插入→表格→将文本转换成表格→✔制表符→确定选中第一列→单击右键→在第一列的右侧插入列→布局→合并单元格&#…

计算机网络 (46)简单网络管理协议SNMP

前言 简单网络管理协议&#xff08;SNMP&#xff0c;Simple Network Management Protocol&#xff09;是一种用于在计算机网络中管理网络节点的标准协议。 一、概述 SNMP是基于TCP/IP五层协议中的应用层协议&#xff0c;它使网络管理员能够管理网络效能&#xff0c;发现并解决网…