基于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-static
和 binfmt-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