3. 飞控参数系统入门

说实话,开发环境搭建这件事,看着琐碎,但真能卡住不少人。我见过太多人花了一周时间,最后连一个./waf configure都没跑过去。其实说白了,ArduPilot的编译环境没那么玄乎,关键是把几个核心工具链理清楚。

这一章,我会带你从零搭一套能干活的环境。双系统、WSL2、VS Code、调试器,一条龙走完。

核心思路:ArduPilot源码编译依赖Linux环境(原生或WSL2),代码编辑用VS Code + PlatformIO,调试用J-Link/SWD。三者打通,你就能在Windows上写代码、在Linux里编译、用调试器单步跟踪飞控行为。

3.1 双系统 vs WSL2:我选哪个?

先回答一个经典问题:到底装双系统还是用WSL2?

我个人习惯是这样的——

  • 如果你要跑实机飞行测试,或者需要直接操作USB串口、JTAG调试器,双系统更稳。WSL2的USB穿透虽然能用,但偶尔会掉链子。
  • 如果你只是编译代码、写逻辑、做仿真,WSL2完全够用。而且切换方便,不用重启。

我在项目中遇到过一种情况:用WSL2编译出来的固件,刷进Pixhawk后一切正常,但用J-Link调试时死活连不上。最后发现是WSL2的USB设备映射没配好。嗯,从那以后,我调试时都切回原生Linux。

对比项 双系统(原生Linux) WSL2
编译速度 快(直接调用硬件) 较快(略有虚拟化损耗)
USB/串口支持 原生,稳定 需配置usbipd-win,偶有延迟
调试器连接 直接识别 需额外映射,不稳定
日常使用便利性 需重启切换 Windows内直接打开,方便
推荐场景 实机调试、硬件验证 日常开发、仿真测试

我的建议:如果你硬盘空间够,装双系统。Windows留作日常,Ubuntu 22.04 LTS专门搞飞控开发。WSL2作为备选方案,出差或临时改代码时用。

3.2 双系统下编译ArduPilot源码

假设你已经装好了Ubuntu 22.04。接下来就是安装依赖、拉代码、编译三步走。

3.2.1 安装基础依赖

打开终端,先更新包管理器:

sudo apt update
sudo apt upgrade -y

然后安装ArduPilot官方推荐的依赖包。我习惯一次性装完,省得后面缺什么再回头补:

sudo apt install -y git python3 python3-pip python3-dev \
  build-essential gcc-arm-none-eabi g++-arm-none-eabi \
  libtool pkg-config autoconf automake \
  libxml2-dev libxslt1-dev libssl-dev \
  libc6-i386 lib32z1 lib32stdc++6 \
  ccache gawk

这里有个坑——gcc-arm-none-eabi的版本。Ubuntu仓库里的版本可能比较老。我曾经因为编译器版本不对,编译出来的固件在Pixhawk上跑飞了。后来我改用ARM官方提供的工具链:

# 下载ARM官方工具链(以Linux x86_64为例)
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2

# 解压到 /opt
sudo tar xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/

# 添加到PATH
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin' >> ~/.bashrc
source ~/.bashrc

# 验证版本
arm-none-eabi-gcc --version

3.2.2 拉取ArduPilot源码

用git克隆官方仓库。注意,ArduPilot的代码库很大,加上子模块,第一次拉取可能要十几分钟:

cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive

我个人习惯把源码放在~/workspace/ardupilot下,方便管理多个项目。

3.2.3 编译Copter固件

ArduPilot使用waf构建系统。先配置,再编译:

# 配置编译目标(以Pixhawk1为例)
./waf configure --board Pixhawk1

# 编译Copter固件
./waf copter

第一次编译会比较慢,因为要编译所有依赖。之后用ccache缓存,第二次就快多了。

注意:如果你编译时遇到Python module相关的错误,很可能是Python3的pip包没装全。运行pip3 install --user future pyserial可以解决大部分问题。

3.3 WSL2配置:Windows下的Linux开发环境

如果你不想装双系统,WSL2是个不错的折中方案。配置起来也不复杂。

3.3.1 安装WSL2和Ubuntu

在Windows PowerShell(管理员)中执行:

# 启用WSL功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 启用虚拟机平台
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

# 重启后,设置WSL2为默认版本
wsl --set-default-version 2

# 安装Ubuntu 22.04
wsl --install -d Ubuntu-22.04

安装完成后,首次启动会要求你创建Linux用户名和密码。之后就可以在WSL2里执行Linux命令了。

3.3.2 在WSL2中编译ArduPilot

进入WSL2终端后,安装依赖和编译步骤跟双系统完全一样。唯一要注意的是:WSL2默认把Windows的硬盘挂载在/mnt/c/下。但我不建议你把源码放在/mnt/c/下编译,因为跨文件系统访问会严重拖慢编译速度。

我踩过这个坑——第一次在WSL2里编译,把源码放在Windows的D盘,结果编译花了40分钟。后来移到WSL2的~/ardupilot下,只用了12分钟。

技巧:在WSL2中,用explorer.exe .可以直接打开当前目录的Windows资源管理器,方便文件拖拽。

3.3.3 USB设备穿透(用于调试器)

如果你需要在WSL2里连接J-Link或串口,需要安装usbipd-win:

# 在Windows PowerShell(管理员)中
winget install usbipd

# 列出所有USB设备
usbipd list

# 绑定J-Link设备(以BUSID 1-1为例)
usbipd bind --busid 1-1

# 在WSL2中连接
usbipd attach --wsl --busid 1-1

连接成功后,在WSL2里用lsusb就能看到J-Link设备了。

3.4 VS Code + PlatformIO插件

代码编辑器我推荐VS Code,配合PlatformIO插件,开发体验直接拉满。

3.4.1 安装VS Code和PlatformIO

  1. 从官网下载VS Code并安装。
  2. 打开VS Code,点击左侧扩展图标,搜索PlatformIO IDE并安装。
  3. 安装完成后,重启VS Code,底部会出现一个蚂蚁头图标——那就是PlatformIO的主入口。

3.4.2 配置PlatformIO项目

PlatformIO默认用platformio.ini管理项目。但ArduPilot有自己的构建系统,所以我们需要让PlatformIO“认识”ArduPilot的源码结构。

我个人习惯的做法是:在ArduPilot源码根目录下创建一个platformio.ini文件,内容如下:

[platformio]
default_envs = px4_fmu-v2
[env:px4_fmu-v2]
platform = ststm32
board = px4_fmu-v2
framework = arduino
build_flags = 
  -I./libraries
  -I./modules
  -DARDUPILOT_BUILD
  -DSTM32F4
  -DHAL_MINIMIZE_FEATURES=0
  -Os
  -g3
  -ggdb
  -std=gnu++11
  -fno-exceptions
  -fno-rtti
  -fno-threadsafe-statics
  -fno-use-cxa-atexit
  -Wno-psabi
  -Wno-deprecated-declarations
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-subobject-linkage
  -Wno-volatile
  -Wno-address
  -Wno-delete-non-virtual-dtor
  -Wno-dangling-pointer
  -Wno-free-nonheap-object
  -Wno-mismatched-new-delete
  -Wno-mismatched-tags
  -Wno-nonnull
  -Wno-nonnull-compare
  -Wno-placement-new
  -Wno-placement-new-expression
  -Wno-pointer-arith
  -Wno-redundant-decls
  -Wno-shift-count-overflow
  -Wno-shift-negative-value
  -Wno-sometimes-uninitialized
  -Wno-switch
  -Wno-tautological-compare
  -Wno-tautological-undefined-compare
  -Wno-trigraphs
  -Wno-undefined-var-template
  -Wno-unknown-attributes
  -Wno-unknown-warning-option
  -Wno-unused-command-line-argument
  -Wno-unused-function
  -Wno-unused-label
  -Wno-unused-result
  -Wno-unused-value
  -Wno-vla
  -Wno-vla-extension
  -Wno-writable-strings
  -Wno-zero-as-null-pointer-constant
  -Wno-zero-length-array
  -Wno-c++11-extensions
  -Wno-c++14-extensions
  -Wno-c++17-extensions
  -Wno-c++20-extensions
  -Wno-gnu-anonymous-struct
  -Wno-gnu-zero-variadic-macro-arguments
  -Wno-nested-anon-types
  -Wno-old-style-cast
  -Wno-pedantic
  -Wno-unknown-pragmas
  -Wno-unused-parameter
  -Wno-unused-variable
  -Wno-sign-compare
  -Wno-format-truncation
  -Wno-narrowing
  -Wno-attributes
  -Wno-missing-field-initializers
  -Wno-reorder
  -Wno-unused-local-typedefs
  -Wno-unknown-pragmas
  -Wno-ignored-qualifiers
  -Wno-maybe-uninitialized
  -Wno-strict-aliasing
  -Wno-array-bounds
  -Wno-stringop-overflow
  -Wno-class-memaccess
  -Wno-cast-function-type
  -Wno-format-overflow
  -Wno-restrict
  -Wno-return-type
  -Wno-sub