Procházet zdrojové kódy

feat: Add toolchain.cmake, already tested

Add script to package dependency lib for built exe/lib
lujw2 před 11 měsíci
rodič
revize
09844bc870
6 změnil soubory, kde provedl 105 přidání a 18 odebrání
  1. 1 1
      Dockerfile
  2. 27 0
      README.md
  3. 23 11
      docker-compose.yml
  4. 2 6
      docker_run.sh
  5. 26 0
      script/copy_dep.sh
  6. 26 0
      toolchain.cmake

+ 1 - 1
Dockerfile

@@ -21,7 +21,7 @@ ENV SHELL /bin/bash
 # ********************************************************
 # * Anything else you want to do like clean up goes here *
 # ********************************************************
-RUN echo 'cd ~/Work/Robot' >> /home/jasper/.bashrc
+RUN echo 'cd ~/Work/' >> /home/jasper/.bashrc
 
 # [Optional] Set the default user. Omit if you want to keep the default as root.
 USER $USERNAME

+ 27 - 0
README.md

@@ -0,0 +1,27 @@
+# 介绍
+该项目是制作一个交叉编译环境,使用arm64容器的apt解决依赖,在使用宿主机上的交叉编译链进行交叉编译。
+同时拥有apt的方便和宿主机交叉编译的性能,岂不美哉?
+## 制作aarch64 文件系统
+1. 拉取arm64镜像
+```bash
+docker pull  --platform linux/arm64 docker.m.daocloud.io/ubuntu:20.04
+```
+2. 跑一个临时镜像,用于导出根文件系统
+```bash
+docker run --name arm-temp -d ubuntu:20.04 sleep infinity
+docker export arm-temp -o ubuntu_rootfs.tar
+```
+3. 将根文件系统解压至宿主机某个文件夹下
+```bash
+sudo mkdir -p /opt/arm/sysroot
+sudo tar -xvf ubuntu_rootfs.tar -C /opt/arm/sysroot
+```
+4. 启动一个arm64容器
+```bash
+docker compose up -d
+```
+## 修改`toolchain.cmake`
+将toolchain.cmake中`ARM_SYSROOT_PATH`指向该根文件系统,之后便能进行交叉编译:
+```
+cmake -B build_arm -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake
+```

+ 23 - 11
docker-compose.yml

@@ -1,22 +1,34 @@
 version: '3'
 services:
   arm_dev:
-    image: arm_dev:v1.0
+    image: ubuntu:20.04
     platform: linux/arm64
-    container_name: arm_dev
+    container_name: arm-sysroot
     privileged: true
     stdin_open: true
     tty: true
     environment:
         DISPLAY: $DISPLAY
     volumes:
-      - /tmp/.X11-unix:/tmp/.X11-unix
-      # nvim and some tools
-      - /home/jasper/.config/:/home/jasper/.config/
-      - /home/jasper/.local/share/nvim:/home/jasper/.local/share/nvim
-      - /home/jasper/.local/state/nvim:/home/jasper/.local/state/nvim
-      - /home/jasper/Software:/home/jasper/Software
-      - /usr/local/bin:/usr/local/bin
-      # Work
       - /dev:/dev
-      - /home/jasper/Work/Robot/:/home/jasper/Work/Robot/
+      - /opt/arm/sysroot/bin:/bin
+      - /opt/arm/sysroot/boot:/boot
+      - /opt/arm/sysroot/dev:/dev
+      - /opt/arm/sysroot/etc:/etc
+      - /opt/arm/sysroot/home:/home
+      - /opt/arm/sysroot/lib:/lib
+      - /opt/arm/sysroot/media:/media
+      - /opt/arm/sysroot/mnt:/mnt
+      - /opt/arm/sysroot/opt:/opt
+      # - /opt/arm/sysroot/proc:/proc
+      - /opt/arm/sysroot/root:/root
+      - /opt/arm/sysroot/run:/run
+      - /opt/arm/sysroot/sbin:/sbin
+      - /opt/arm/sysroot/srv:/srv
+      - /opt/arm/sysroot/sys:/sys
+      - /opt/arm/sysroot/tmp:/tmp
+      - /opt/arm/sysroot/usr:/usr
+      - /opt/arm/sysroot/var:/var
+
+
+

+ 2 - 6
docker_run.sh

@@ -2,13 +2,9 @@
 
 docker run -d -it \
     --platform linux/arm64 \
-    --name arm_dev \
+    --name arm_dev_a \
     --network=host \
-    --env DISPLAY=$DISPLAY \
     --privileged \
-    -v /tmp/.X11-unix:/tmp/.X11-unix  \
-    -v /dev:/dev \
-    -v /home/jasper/Work/Robot/:/home/jasper/Work/Robot/ \
-    -v /opt/daystar:/opt/daystar \
     ubuntu:20.04
+    # --mount source=arm_usr,target/usr \
 

+ 26 - 0
script/copy_dep.sh

@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+# 输入可执行文件的路径
+executable_path="$1"
+# 打包路径
+output_dir="$2"
+
+# 检查是否提供了可执行文件路径
+if [ -z "$executable_path" ]; then
+    echo "Usage: $0 /path/to/lib /path/to/output"
+    exit 1
+fi
+
+# 创建目标目录来存放依赖库
+# output_dir="./my_project/lib"
+if [ ! -d $output_dir ]; then
+    mkdir -p "$output_dir"
+fi
+
+# 使用 ldd 获取依赖库,并复制到目标目录
+ldd "$executable_path" | grep "=> /" | awk '{print $3}' | while read lib; do
+    cp --parents "$lib" "$output_dir"
+done
+
+echo "依赖库已复制到 $output_dir"
+

+ 26 - 0
toolchain.cmake

@@ -0,0 +1,26 @@
+# 设置交叉编译工具链路径
+SET(CROSS_COMPILE_AARCH64_PATH /opt/buildtool)
+SET(CROSS_COMPILE_AARCH64 ${CROSS_COMPILE_AARCH64_PATH}/bin/aarch64-linux-)
+
+SET(ARM_SYSROOT_PATH /opt/arm/sysroot)
+
+# 设置编译器和链接器
+SET(CMAKE_C_COMPILER ${CROSS_COMPILE_AARCH64}gcc)
+SET(CMAKE_CXX_COMPILER ${CROSS_COMPILE_AARCH64}g++)
+
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_PROCESSOR aarch64)
+
+# Target sysroot
+set(CMAKE_FIND_ROOT_PATH ${ARM_SYSROOT_PATH})
+set(CMAKE_INCLUDE_PATH  /usr/include/aarch64-linux-gnu)
+set(CMAKE_LIBRARY_PATH  /usr/lib/aarch64-linux-gnu)
+set(CMAKE_PROGRAM_PATH  /usr/bin/aarch64-linux-gnu)
+
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--rpath-link,${ARM_SYSROOT_PATH}/usr/lib/aarch64-linux-gnu")
+
+# ONLY means use CMAKE_FIND_ROOT_PATH, NEVER means use CMAKE_SYSROOT
+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)