基于VSCode+CMake+debootstrap搭建Ubuntu交叉編譯開發環境

基于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.pswp.cn/web/66454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66454.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NiceFish(美人魚)

前端有 3 個版本&#xff1a; 瀏覽器環境移動端環境Electron 環境 服務端有 2 個版本&#xff1a; SpringBoot 版本&#xff08;已實現基于 Apache Shiro 的 RBAC 權限控制&#xff09;SpringCloud 版本 1.主要依賴 名稱版本描述Angular16.2.0Angular 核心庫。PrimeNG16.2…

華為ENSP:STP和鏈路聚合的管理與配置

這里將不再過度闡述STP和鏈路聚合的理論知識&#xff0c;不清楚的同學可以去觀看Cisco文章中的理論知識 理論知識https://blog.csdn.net/2301_76341691/article/details/145166547?fromshareblogdetail&sharetypeblogdetail&sharerId145166547&sharereferPC&…

【PyCharm】連接 Git

【PyCharm】相關鏈接 【PyCharm】連接 Git【PyCharm】連接Jupyter Notebook【PyCharm】快捷鍵使用【PyCharm】遠程連接Linux服務器【PyCharm】設置為中文界面 要在 PyCharm 中連接 Git&#xff0c;確保您的開發環境已經安裝了 Git&#xff0c;并且 PyCharm 能夠訪問它。 以下…

dl學習筆記:(4)簡單神經網絡

&#xff08;1&#xff09;單層正向回歸網絡 bx1x2z100-0.2110-0.05101-0.051110.1 接下來我們用代碼實現這組線性回歸數據 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…

三、華為交換機 Hybrid

一、Hybrid功能 Hybrid口既可以連接普通終端的接入鏈路&#xff08;類似于Access接口&#xff09;&#xff0c;又可以連接交換機間的干道鏈路&#xff08;類似于Trunk接口&#xff09;。它允許多個VLAN的幀通過&#xff0c;并可以在出接口方向將某些VLAN幀的標簽剝掉&#xff0…

Tensor 基本操作1 | PyTorch 深度學習實戰

目錄 創建 Tensor常用操作unsqueezesqueezeSoftmax代碼1代碼2代碼3 argmaxitem 創建 Tensor 使用 Torch 接口創建 Tensor import torch參考&#xff1a;https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html 常用操作 unsqueeze 將多維數組解套&#xf…

Grafana系列之面板接入Prometheus Alertmanager

關于Grafana的儀表板Dashboard&#xff0c;以及面板Panel&#xff0c;參考Grafana系列之Dashboard。可以直接在面板上創建Alert&#xff0c;即所謂的Grafana Alert&#xff0c;參考Grafana系列之Grafana Alert。除了Grafana Alert外&#xff0c;面板也可接入Prometheus Alertma…

Windows 上安裝 MongoDB 的 zip 包

博主介紹&#xff1a; 大家好&#xff0c;我是想成為Super的Yuperman&#xff0c;互聯網宇宙廠經驗&#xff0c;17年醫療健康行業的碼拉松奔跑者&#xff0c;曾擔任技術專家、架構師、研發總監負責和主導多個應用架構。 近期專注&#xff1a; RPA應用研究&#xff0c;主流廠商產…

LeetCode 2266.統計打字方案數:排列組合

【LetMeFly】2266.統計打字方案數&#xff1a;排列組合 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-texts/ Alice 在給 Bob 用手機打字。數字到字母的 對應 如下圖所示。 為了 打出 一個字母&#xff0c;Alice 需要 按 對應字母 i 次&#xff0c…

PTA乙級1001~1005【c++】

首先講解一下PTA乙級在哪里。PTA乙級題其實就是PAT (Basic Level) Practice &#xff08;中文&#xff09; 1001 害死人不償命的(3n1)猜想 #include<iostream> using namespace std;int main() {int cnt 0;int n;cin >> n;while(n ! 1){cnt ;if (n & 1){n …

滲透筆記1

第一天 工具&#xff1a;cs cobalt strike 4.9 / msf kali &#xff08;自帶 Ubuntu&#xff09; cs cobalt strike 4.9&#xff1a;server-client server部署在云服務器上&#xff0c;client分別在各地&#xff0c;與server相連接&#xff1b;連接上后就可以共享上線主機。…

用Python實現SVM搭建金融反詐模型(含調試運行)

1.概述 信用卡盜刷一般發生在持卡人信息被不法分子竊取后&#xff0c;復制卡片進行消費或信用卡被他人冒領后激活并消費等情況下。一旦發生信用卡盜刷&#xff0c;持卡人和銀行都會遭受一定的經濟損失。本節要運用支持向量機分類算法搭建一個金融反欺詐模型。 2.數據集 使用…

HunyuanVideo 文生視頻模型實踐

HunyuanVideo 文生視頻模型實踐 flyfish 運行 HunyuanVideo 模型使用文本生成視頻的推薦配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值顯存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本項目適用于使用 N…

第6章 ThreadGroup詳細講解(Java高并發編程詳解:多線程與系統設計)

1.ThreadGroup 與 Thread 在Java程序中&#xff0c; 默認情況下&#xff0c; 新的線程都會被加入到main線程所在的group中&#xff0c; main線程的group名字同線程名。如同線程存在父子關系一樣&#xff0c; Thread Group同樣也存在父子關系。圖6-1就很好地說明了父子thread、父…

nginx常用配置 (含負載均衡、反向代理、限流、Gzip壓縮、圖片防盜鏈 等示例)

nginx的配置文件通常在 /etc/nginx/nginx.conf , /etc/nginx/conf.d/*.conf 中&#xff0c; 一般直接 改 conf.d目錄下的 default.conf文件&#xff0c; 然后 先檢測配置文件是否有錯誤 nginx -t 再重新加載配置文件 或 重啟nginx&#xff0c;命令如下 nginx -s reload 或…

Python編程與在線醫療平臺數據挖掘與數據應用交互性研究

一、引言 1.1 研究背景與意義 在互聯網技術飛速發展的當下,在線醫療平臺如雨后春筍般涌現,為人們的就醫方式帶來了重大變革。這些平臺打破了傳統醫療服務在時間和空間上的限制,使患者能夠更加便捷地獲取醫療資源。據相關報告顯示,中國基于互聯網的醫療保健行業已進入新的…

Linux網絡_套接字_UDP網絡_TCP網絡

一.UDP網絡 1.socket()創建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET網絡 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;適用于 IPv4 協議。用于網絡通信AF_INET6&#xff1a;IPv6 地址族&a…

1 行命令引發的 Go 應用崩潰

一、前言 不久前&#xff0c;阿里云 ARMS 團隊、編譯器團隊、MSE 團隊攜手合作&#xff0c;共同發布并開源了 Go 語言的編譯時自動插樁技術。該技術以其零侵入的特性&#xff0c;為 Go 應用提供了與 Java 監控能力相媲美的解決方案。開發者只需將 go build 替換為新編譯命令 o…

R語言的并發編程

R語言的并發編程 引言 在現代計算中&#xff0c;如何有效地利用計算資源進行數據處理和分析已成為一個重要的研究方向。尤其在大數據時代&#xff0c;數據量的急劇增加讓單線程處理方式顯得力不從心。為了解決這一問題&#xff0c;各種編程語言都開展了并發編程的研究和應用。…

Flink(十):DataStream API (七) 狀態

1. 狀態的定義 在 Apache Flink 中&#xff0c;狀態&#xff08;State&#xff09; 是指在數據流處理過程中需要持久化和追蹤的中間數據&#xff0c;它允許 Flink 在處理事件時保持上下文信息&#xff0c;從而支持復雜的流式計算任務&#xff0c;如聚合、窗口計算、聯接等。狀…