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
- 从官网下载VS Code并安装。
- 打开VS Code,点击左侧扩展图标,搜索PlatformIO IDE并安装。
- 安装完成后,重启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