基于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