编译相关

Posted by fjw on August 9, 2022

编译选项

类别 参数 说明
语言标准 --std=c++17 设置使用的 C++ 语言标准。
通用告警 -Wall -Wextra -Wfloat-equal -Wshadow -Wformat=2 启用常见的编译器警告。
通用告警 -Werror=return-type 将返回类型相关的警告视为错误。gcc10优化激进,不消除此类告警运行时必然跑飞。
优化 -O1-O2 -O2 约比 -O1 快十分之一,-O3 可能不如 -O2
优化 -fno-strict-aliasing 禁用严格的别名规则,防止潜在的优化错误。
优化 -DNDEBUG 禁用断言(通常用于发布版本)。
架构约定 -fsigned-char char 类型设为有符号。
架构约定 -fvisibility=hidden 默认隐藏符号,减少符号导出,提升安全性。
架构约定 -pthread 启用多线程支持(同时影响编译和链接阶段)。
安全 -D_FORTIFY_SOURCE=2 启用额外的编译时和运行时安全检查。
安全 -fstack-protector-strong 启用强栈保护,防止栈溢出攻击。
可维护 -g 生成调试信息。
可维护 -fno-omit-frame-pointer 保留帧指针,便于调试和性能分析。
BEP -ffile-prefix-map=*=* 用于构建环境路径映射。
BEP -fno-canonical-system-headers 微服务通过标记依赖为系统库来抑制外部告警时需要开启。
可维护 -femit-class-debug-always 对于外部类型也生成调试信息,但是该选项在 Clang 系工具中会报错。
告警 -isystem 抑制三方组件告警,最好是配合 -fno-canonical-system-headers 避免 BEP 问题。
告警 -Werror -Wno-error=cpp 如果没有开启 -isystem,请勿在正式版本构建中开启,这样升级依赖可能导致版本构建失败。
安全 -Wframe-larger-than=4096 警告栈帧大小超过 4096 字节,提示可能的栈重叠风险。
安全 -fstack-check 运行时防止栈重叠,对于效率有一定影响。
安全 -ftrapv 检查有符号整型溢出,对效率影响较大。

链接选项

类别 参数 说明
架构约定 -pthread 启用多线程支持(同时影响编译和链接阶段)。
安全 -fPIC -pie 生成位置无关代码(用于共享库)和可执行的 PIE。
安全 -Wl,-z,relro,-z,noexecstack,-z,now 链接器选项,启用多种安全保护措施,如只读重定位、禁止执行堆栈和立即绑定。
健壮性 -Wl,--no-undefined,-allow-shlib-undefined 链接器选项,确保所有符号在链接时都已定义,或允许共享库中未定义的符号。