cmake_vcpkg_meson交叉编译arm64_raspberry_pi程序

2024/01/31

Tags: C++ VCPKG CMake Meson RaspberryPI Arm64 Cross-comple

Table of Contents

0. 背景

大概是上个月左右,协助韩博把我写的这套网口相机框架运行到树莓派上,一直想找时间 记录一下,终于有时间 了。

除了交叉编译我们自己的代码之外,还有一些依赖的3方的框架也需要编译为arm64的库,大概会按我下面列的这几点为大纲进行记录

vcpkg用于安装大部分版本稳定的三方框架,少部分三方框架用vcpkg安装也不一定编译得了,因为官方只维护几种常用的triplets,如果是自定义太高的编译工作,将不得不使用社区版本的triplets,将使vcpkg遇到比平时更多的编译问题,当然如果有时间 +有能力的话,可以fix这些bug为vcpkg提交pr ,这部分工作通常由微软的vcpkg小组和社区开发者一同维护

接下来我不会很详细的介绍某个具体的库是怎么编译的,甚至会跳过,主要介绍交叉编译的大致过程

目录

1. 准备工作

1.1 arm64 gcc 下载

1.2 复制树莓派 systemroot库目录,用于交叉编译时程序链接

略 ,韩博做的镜像 host:rpi4-1中已经有做这个操作了,/sysroot 这个目录

1.3 编译环境docker制作

SW/dv-qt-dev: Dockerfiles and scripts for QT development with containers. - dv-qt-dev (deepvision-tech.net)

之前韩博写的这个dockerfile里,是从qt 安装包安装qt 的.run安装包+提取安装包脚本 安装qt 5.12.6,

但qt 5.15没有.run安装包,所以需要自己编译

所以如果你想编译的是5.12.6,可以直接使用这个docker file

如果想用5.15,可以参考我在韩博的帮助下,创建的这个dockerfile,它没有包含qt的编译,我们以它做成的容器为环境,在容器中编译qt到我们挂载的卷上

build_dev_env.docker

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
FROM --platform=linux/amd64 ubuntu:16.04

ENV DEBIAN_FRONTEND=noninteractive

#RUN touch /etc/apt/sources.list && \
#echo "deb http://ftp.cn.debian.org/debian bookworm main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \
#echo "deb http://ftp.cn.debian.org/debian-security/ bookworm-security main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \
#echo "deb http://ftp.cn.debian.org/debian bookworm-updates main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \
#echo "deb-src http://ftp.cn.debian.org/debian bookworm main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \
#echo "deb-src http://ftp.cn.debian.org/debian-security/ bookworm-security main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \
#echo "deb-src http://ftp.cn.debian.org/debian bookworm-updates main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \


COPY set_aptsource.sh /etc/apt

RUN chmod +x  /etc/apt/set_aptsource.sh && bash /etc/apt/set_aptsource.sh &&\
apt update && \
apt install -y \
autoconf \
libtool \
autoconf-archive \
automake \
bison \
build-essential \
cmake \
cowsay \
ethtool \
figlet \
flex \
freeglut3-dev \
g++-aarch64-linux-gnu \
gawk \
gcc-aarch64-linux-gnu \
gcc \
gdb-multiarch \
gfortran \
git \
gperf \
libatspi2.0-dev \
libavcodec-dev \
libavformat-dev \
libcap-dev \
libcap2 \
libclang-dev \
libdc1394-22-dev \
libfontconfig1-dev \
libfreetype6-dev \
libgl1-mesa-dev \
libglade2-0 \
libglade2-dev \
libglu1-mesa-dev \
libgstreamer-plugins-base0.10-dev \
libgtk-3-dev \
libjasper-dev \
libjpeg-dev \
liblapack-dev \
libncurses-dev \
libpcap0.8 \
libpng12-dev \
libsndio-dev \
libssh2-1 \
libswscale-dev \
libtiff-dev \
libva-dev \
libva-drm1 \
libva-egl1 \
libva-glx1 \
libva1 \
libx11-dev \
libx11-xcb-dev \
libxcb-glx0-dev \
libxcb-icccm4-dev \
libxcb-image0-dev \
libxcb-keysyms1-dev \
libxcb-randr0-dev \
libxcb-render-util0-dev \
libxcb-shape0-dev \
libxcb-shm0-dev \
libxcb-sync-dev \
libxcb-sync0-dev \
libxcb-util-dev \
libxcb-xfixes0-dev \
libxcb-xinerama0-dev \
libxcb-xkb-dev \
libxcb1-dev \
libxext-dev \
libxfixes-dev \
libxi-dev \
libxkbcommon-dev \
libxkbcommon-x11-0 \
libxkbcommon-x11-dev \
libxrender-dev \
libxslt1-dev \
lsb-release \
make \
mesa-common-dev \
ninja-build \
openssl \
pigz \
pkg-config \
python3-pip \
python3 \
rsync \
subversion \
tar \
texinfo \
unzip \
vim \
wget \
x11vnc \
xauth \
zlib1g-dev && \
mkdir /build && \
mkdir /src && \
mkdir /repos  && \
apt-get clean  

CMD ["/usr/bash"]


#pip3 install openpyxl==2.6.4 && \
#pip3 install xlrd==1.2.0 && \
#libgli-mesa-dev \
#libglul-mesa-dev \

上面dockerfile用到的替换apt源的脚本,用于把镜像的apt源替换为我们公司的apt缓存

set_aptsource.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

OldSource=`grep ^deb /etc/apt/sources.list|awk '{print $2}'|sort |uniq |sed '/security.ubuntu.com/d'`
NewSource="-apt.deepvision-tech.net/repository/apt-"
OsVer=`cat /etc/issue|awk -F'[ .]+' '{print $2}'`

cp -f /etc/apt/sources.list /etc/apt/sources.list.bak
echo ""
echo -e  "${YELOW}** Old apt sources backup to [/etc/apt/sources.list.bak] **${RES}"
sed -i "s#${OldSource}#http://hz${NewSource}${OsVer}/#g" /etc/apt/sources.list
echo -e "${YELOW}** new apt source replaced by [http://hz${NewSource}${OsVer}] **${RES}"
echo -e "${YELOW}** Please run command [sudo apt update],Let config become effective **${RES}"

把它们俩放在同一目录,然后在进入目录,执行

1
docker build build_dev_env.docker . -t dockerRepoName:tag

这样就能构建docker镜像了

2. 编译arm64 Qt5.15.11

2.1 Qt5.15 源码获取

如果你对qt的版本历史熟悉的话,应该知道,从官方网站上能下载到的最后一个开源版本的安装包是是Qt 5.14,再往后,需要下载Qt的在线安装器,在线安装, 由于我们将在编译服务器的docker容器中进行编译,默认情况下是没有gui支持的 ,所以用图形化的安装会多做一些步骤,虽然韩博已经有写过相关的文档,也可以做到,但我们还是更倾向于使用源码编译Qt5.15,因为在编译服务器160核的加持下,编译一个Qt5只需要大概十分钟左右

所以需要获取Qt5.15的源码,

从vcpkg源码中可以获取到qt5的源码下载路径,(不直接使用vcpkg是因为qt编译选项比较多,直接编译比较灵活)

qt_download_submodule.cmake这个文件中这几行中,可以看到获取到伯克利大学提供的qt源码

1
2
3
4
5
6
    set(FULL_VERSION "${QT_MAJOR_MINOR_VER}.${QT_PATCH_VER}")
    set(ARCHIVE_NAME "${NAME}-everywhere-opensource-src-${FULL_VERSION}.tar.xz")
    set(URLS
        "https://download.qt.io/archive/qt/${QT_MAJOR_MINOR_VER}/${FULL_VERSION}/submodules/${ARCHIVE_NAME}"
        "https://mirrors.ocf.berkeley.edu/qt/archive/qt/${QT_MAJOR_MINOR_VER}/${FULL_VERSION}/submodules/${ARCHIVE_NAME}"
    )

也可以从浏览器直接进入 OCF Mirrors (berkeley.edu)

如果要完整的源码,下载single目录下的tar包

如果只是要编译某个子模块,下载submodules里的具体模块的tar包

2.2 配置编译选项

树莓上有两种gui模式,一种是系统只有一个窗口,需要qt编译选项egfls,一种传统桌面系统,需要qt对应的编译选项是x11或wayland模式

eglfs的特点是系统除了命令行窗口,这种情况下适合使用qt quick controls 2 + opengl es开发,因为qt quick controls 2本身就是混合渲染的,控件不会创建系统原生窗口,

相对于eglfs, x11或wayland 通常每个控件都会创建单独的系统原生窗口, qt quick controls 1 和 qt widget都是这个模式,

配置qt的树霉交叉编译选项时,主要这个需要注意

其他的都是模块选项,安装目录之类的,这里主要还是参考韩博之前写的文档的脚本

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/bin/bash

# vim: tabstop=4 shiftwidth=4 softtabstop=4
# -*- sh-basic-offset: 4 -*-

set -exuo pipefail

BUILD_TARGET=/build
SRC=/src

# Note: If changing the QT_BRANCH to a lower version, modify line 43 for the correct path
QT_BRANCH="5.15.11"
DEBIAN_VERSION=$(lsb_release -cs)
MAKE_CORES=64

/usr/games/cowsay -f tux 'Building QT version $QT_BRANCH.'

function patch_qt () {
    local QMAKE_FILE='/src/qt5/qtbase/mkspecs/devices/linux-rasp-pi4-v3d-g++/qmake.conf'
	
	echo "" > "$QMAKE_FILE"
	echo 'include(../common/linux_device_pre.conf)' >> "$QMAKE_FILE"
	echo 'QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}' >> "$QMAKE_FILE"
	echo 'QMAKE_LIBS_OPENGL_ES2   = $${VC_LINK_LINE} -lGLESv2' >> "$QMAKE_FILE"
	echo 'QMAKE_LIBS_EGL          = $${VC_LINK_LINE} -lEGL -lGLESv2' >> "$QMAKE_FILE"
	#echo 'QMAKE_LIBDIR_BCM_HOST   = $$VC_LIBRARY_PATH' >> "$QMAKE_FILE"
	#echo 'QMAKE_INCDIR_BCM_HOST   = $$VC_INCLUDE_PATH' >> "$QMAKE_FILE"
	#echo 'QMAKE_LIBS_BCM_HOST     = -lbcm_host' >> "$QMAKE_FILE"
	echo 'QMAKE_CFLAGS            = -march=armv8-a' >> "$QMAKE_FILE"
	echo 'QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS' >> "$QMAKE_FILE"
	echo 'QT_QPA_DEFAULT_PLATFORM = xcb' >> "$QMAKE_FILE"
	#echo 'EGLFS_DEVICE_INTEGRATION= eglfs_kms' >> "$QMAKE_FILE"
	echo 'load(qt_config)' >> "$QMAKE_FILE"
}


function fetch_qt5 () {
    pushd /src
    if [ ! -d "qt5" ]; then
		mkdir qt5
        tar xf /src/qt-everywhere-opensource-src-"$QT_BRANCH".tar.xz -C ./qt5 --strip-components=1
	fi
    popd	
}

function build_qt () {
    local SRC_DIR="/src/$1"

    if [ ! -f "$BUILD_TARGET/qt5-$QT_BRANCH-$DEBIAN_VERSION-$1.tar.gz" ]; then
        /usr/games/cowsay -f tux "Building QT for $1"

        fetch_qt5

        mkdir -p "$SRC_DIR"
        pushd "$SRC_DIR"

        patch_qt

        /src/qt5/configure \
            -device linux-rasp-pi4-v3d-g++ \
            -opengl es2 \
			-egl \
			-qpa xcb \
			-xcb  \
			-eglfs \
            -opensource \
            -confirm-license \
            -device-option CROSS_COMPILE=aarch64-linux-gnu- \
            -extprefix "$SRC_DIR/qt5pi" \
            -pkg-config \
            -qt-pcre \
            -no-pch \
            -evdev \
            -system-freetype \
            -fontconfig \
            -glib \
            -make libs \
            -no-compile-examples \
            -no-cups \
            -no-gtk \
            -no-use-gold-linker \
            -nomake examples \
            -nomake tests \
            -prefix /usr/local/qt5pi \
            -release \
            -skip qtwebengine \
            -skip qtandroidextras \
            -skip qtgamepad \
            -skip qtlocation \
            -skip qtlottie \
            -skip qtmacextras \
            -skip qtpurchasing \
            -skip qtscxml \
            -skip qtsensors \
            -skip qtserialbus \
            -skip qtserialport \
            -skip qtspeech \
            -skip qttools \
            -skip qttranslations \
            -skip qtvirtualkeyboard \
            -skip qtwayland \
            -skip qtwebview \
            -skip qtwinextras \
            -skip wayland \
            -sysroot /sysroot \
            -no-feature-eglfs_brcm \
            -recheck \
            -platform linux-g++-64 \
            -L/sysroot/lib/aarch64-linux-gnu \
            -L/sysroot/usr/lib/aarch64-linux-gnu \
            -I/sysroot/usr/include/ \
            -L/sysroot/lib/mesa-diverted/aarch64-linux-gnu \
            -I/sysroot/usr/include/GLES2 \
            -I/sysroot/usr/include/GLES


        /usr/games/cowsay -f tux "Making Qt..."
        make -j"$MAKE_CORES"

        /usr/games/cowsay -f tux "Installing Qt..."
        make install

        pushd "$SRC_DIR"
        tar cfz "$BUILD_TARGET/qt5-$QT_BRANCH-$DEBIAN_VERSION-$1.tar.gz" qt5pi
        popd

        pushd "$BUILD_TARGET"
        sha256sum "qt5-$QT_BRANCH-$DEBIAN_VERSION-$1.tar.gz" > "qt5-$QT_BRANCH-$DEBIAN_VERSION-$1.tar.gz.sha256"
        popd
    else
        echo "QT Build already exist."q
    fi
}

# Fix relative paths for Raspberry Pi Sysroot

build_qt "pi5"

3. cmake交叉编译树莓派的工具链配置

toolchain-arm64-raspberrypie.cmake

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#参考文档 https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-linux
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm64)

#树莓派sysroot目录
set(CMAKE_SYSROOT /sysroot) 
#安装目录
set(CMAKE_STAGING_PREFIX /repos/dv_app_solution/vcpkg_installed/arm64-linux) 

#指定编译器
set(tools /usr)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)


#手动指定arm64的qt cmake模块
set(QT_DIR /src/pi5/qt5pi/lib/cmake/Qt5)
set(Qt5_DIR /src/pi5/qt5pi/lib/cmake/Qt5)
set(ENV{QT_DIR} /src/pi5/qt5pi/lib/cmake/Qt5)
set(ENV{QT_DIR} /src/pi5/qt5pi/lib/cmake/Qt5)
set(QT_QMAKE_EXECUTABLE /src/pi5/qt5pi/bin/qmake)
set(Qt5Core_DIR /src/pi5/qt5pi/lib/cmake/Qt5Core)
set(Qt5Gui_DIR /src/pi5/qt5pi/lib/cmake/Qt5Gui)
set(Qt5Widgets_DIR /src/pi5/qt5pi/lib/cmake/Qt5Widgets)
set(Qt5Quick_DIR /src/pi5/qt5pi/lib/cmake/Qt5Quick)
set(Qt5QuickControls2_DIR /src/pi5/qt5pi/lib/cmake/Qt5QuickControls2)
set(Qt5QmlModels_DIR /src/pi5/qt5pi/lib/cmake/Qt5QmlModels)
set(Qt5Qml_DIR /src/pi5/qt5pi/lib/cmake/Qt5Qml)
set(Qt5Network_DIR /src/pi5/qt5pi/lib/cmake/Qt5Network)
set(Qt5LinguistTools_DIR /src/pi5/qt5pi/lib/cmake/Qt5LinguistTools)

#因为是交叉编译,所以主机里有arm64的库也有amd64的库,下面这几行设置不让cmake自己在目录中搜索库,
#而是通过手动设置库的路径,防止编译错误
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)

#cmake prefix
set(CMAKE_PREFIX_PATH /src/pi5/qt5pi;/repos/dv_app_solution/vcpkg_installed/arm64-linux)

4.meson交叉编译配置

toolchain-arm64-raspberrypie-messon.cross

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#参考文档1 https://mesonbuild.com/Cross-compilation.html
#参考文档2 https://github.com/mesonbuild/meson/blob/master/docs/markdown/Reference-tables.md#cpu-families

[binaries]
c = '/usr/bin/aarch64-linux-gnu-gcc'
cpp = '/usr/bin/aarch64-linux-gnu-g++'
ar = '/usr/bin/aarch64-linux-gnu-ar'
strip = '/usr/bin/aarch64-linux-gnu-strip'

[properties]
sys_root = '/sysroot'
c_args = ['-march=armv8-a', '-mtune=cortex-a53', '-marm']  #
cpp_args = ['-std=c++17','-march=armv8-a', '-mtune=cortex-a53', '-marm']  #

#pkg_config_libdir = '/repos/dv_app_solution/vcpkg_installed/arm64-linux'
#sizeof_int = 4
#sizeof_wchar_t = 4
#sizeof_void* = 4
#
#alignment_char = 1
#alignment_void* = 4
#alignment_double = 4
#
#has_function_printf = true


#c_args = ['-march=armv8-a', '-mtune=cortex-a53', '-marm','-I/src/pi5/qt5pi/include','-I/repos/dv_app_solution/vcpkg_installed/arm64-linux/include']  #
#cpp_args = ['-march=armv8-a', '-mtune=cortex-a53', '-marm','-I/src/pi5/qt5pi/include','-I/repos/dv_app_solution/vcpkg_installed/arm64-linux/include']  #
#library_dirs = ['/src/pi5/qt5pi/lib','/repos/dv_app_solution/vcpkg_installed/arm64-linux/lib']
#/repos/dv_app_solution/vcpkg_installed/arm64-linux/include/glib-2.0/glib-object.h


[build_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'

[host_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'

[target_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'

5. vcpkg配置

5.1 使用本地的qt,绕过下载qt,编译qt的步骤

使用custom-ports

例如,想用vcpkg安装vtk,但vtk中依赖了qt,这时可以复制一份vtk在vcpkg中的配置

1
cp -rf  path2vcpkg/ports/vtk/   ~/my-custom-vtk-port

然后把 ~/my-custom-vtk-port/vcpkg.json 中的dependency json 数组 结点中的qt相关的条目删除掉

然后 vcpkg install的时候加上 --overlay-ports=~/my-custom-vtk-port

或者直接修改vcpkg的源码,在原来的port/vcpkg.json中直接删除qt相关的条目

安装时不用--overlay-ports也不会下载 编译 qt

5.2 为vcpkg设置交叉编译工具链

使用custom-triplet

复制一份vcpkg源码下的triplet

1
cp -rf path2vcpkg/triplits  ~/my-custom-triplets

然后修改~/my-custom-triplets/community/arm64-linux.cmake

内容改为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20

set(VCPKG_TARGET_ARCHITECTURE arm64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)

set(VCPKG_CMAKE_SYSTEM_NAME Linux)

set(VCPKG_BUILD_TYPE release)

set(QT_DIR /src/pi5/qt5pi/lib/cmake)
set(ENV{QT_DIR} /src/pi5/qt5pi/lib/cmake)

set(Qt5_DIR /src/pi5/qt5pi/lib/cmake)
set(ENV{Qt5_DIR} /src/pi5/qt5pi/lib/cmake)

set(VCPKG_ENV_PASSTHROUGH QT_DIR  Qt5_DIR)

set(CMAKE_TOOLCHAIN_FILE /repos/vcpkg/toolchains/arm64-raspberrypie.cmake)
set(ENV{CMAKE_TOOLCHAIN_FILE} /repos/vcpkg/toolchains/arm64-raspberrypie.cmake)
set(VCPKG_MESON_CROSS_FILE /repos/vcpkg/toolchains/arm64-raspberrypie-meson.cross)

由于我们在5.1中已经 设置了vcpkg不下载编译qt5,所以我们在这个triplet文件中,设置了qt5的本地路径,然后

然后设置CMAKE_TOOLCHAIN_FILE为步骤3中写的cmake 工具链

设置VCPKG_MESON_CROSS_FILE为步骤4中的meson交叉编译配置文件

然后在使用使用配置好的交叉编译的triplet进行安装

1
vcpkg install --overlay-triplets=~/my-custom-triplets  --triplet=arm64-linux  --host-triplet=x64-linux

这样所安装的库就会按配置进行交叉编译了

6 编译我们自己的cmake工程

1
2
3
4
5
6
7
cd  dv_app_solution #进入我们的工程
mkdir build && cd build
cmake  -DCMAKE_TOOLCHAIN_FILE=~/path/to/toolchain-arm64-raspberrypie.cmake \
-DCMAKE_PREFIX_PATH=/path/to/pi5/qt5pi/lib/cmake;/repos/dv_app_solution/vcpkg_installed/arm64-linux \
..

cmake --build . --target=install

其中/repos/dv_app_solution/vcpkg_installed/arm64-linux 为vcpkg 库安装的目录,写在步骤3中的toolchain-arm64-raspberrypie.cmake

注意

dv_app_solution首次编译时,如果没有把所有子模块发布到vcpkg,通过vcpkg安装依赖项,则需要手动逐个编译子模块,

否则会因为cmake 的find_package找不到依赖,导致编译失败 ,编译安装顺序为

后续会参考其他开源项目的常用做法,编写bashpowershell的初始化编译脚本

>> Home

Comments