gcc 和 g++ 是 GCC 驱动程序。它们根据输入后缀和选项选择语言前端,运行预处理和编译,调用汇编器,并协调链接器。GCC 手册具有权威性,因为确切默认值取决于配置的目标和 GCC 版本。
驱动程序阶段和语言默认值 #
对于源文件,驱动程序可以在预处理(-E)、编译为汇编(-S)或汇编为目标文件(-c)后停止。不使用停止选项时,它会链接生成的目标文件和库。
g++ -std=c++20 -O2 -Wall -Wextra -c source.cc -o source.o
g++ source.o -o programg++ 会为相关输入选择 C++ 处理,并在链接时自动添加 C++ 运行时库。因此,即使目标文件是分别编译的,也应使用 g++ 完成 C++ 程序的最终链接。gcc 是面向 C 的驱动程序;传递 -x c++ 会更改输入语言,但不会自行提供 g++ 的 C++ 链接默认值。
执行时使用 -v 打印驱动程序活动。使用 -### 打印驱动程序将执行的命令,但不实际运行。-print-prog-name=cc1plus、-print-search-dirs 和 -dumpspecs 可用于诊断,显示已配置的程序、搜索路径和驱动程序规范,不应作为可移植构建逻辑。
依赖关系和中间文件 #
从编译器生成头文件依赖:
CPPFLAGS += -MMD -MP
OBJECTS := main.o parse.o
-include $(OBJECTS:.o=.d)-MMD 生成用户头文件依赖,同时省略系统头文件;-MP 为之后可能被删除的头文件添加伪目标。使用 -MF 选择依赖文件,使用 -MT 或 -MQ 控制其目标。需要检查某个阶段时,-save-temps 会保留预处理和汇编中间文件。
链接、规范和搜索路径 #
驱动程序将规范展开为命令,以选择启动目标文件、libgcc、语言运行时和链接器。-specs=file 会改变该展开过程,是工具链配置机制,而不是通用项目选项。
-Bprefix 更改从属程序及相关文件的搜索前缀。--sysroot=dir 为交叉工具链重新定位目标头文件和库。-I 影响头文件查找;-L 添加库目录;-lname 选择库。对于传统静态归档,链接顺序很重要,因此应将归档放在引用它的目标文件之后。通过 -Wl,option 传递链接器特定选项,并将构建系统目标配置与主机默认值分开。
诊断和可复现调用 #
启用有文档记录的警告策略,然后仅在项目能在受支持的编译器之间维护时,使用 -Werror= 提升选定警告。使用 -g 添加调试信息;应有意选择优化级别,因为优化会改变代码生成,并可能暴露未定义行为。
GCC 可以按配置的格式生成机器可读诊断,但可用性会随版本变化。在将 JSON、SARIF、颜色或路径格式输出作为 CI 契约之前,先查询 gcc --help=common 和匹配的已安装手册。失败构建日志中应保留完整的驱动程序调用、编译器版本、目标三元组和相关环境,因为它们都会参与形成有效工具链。
评论
在 GitHub 上阅读或评论(发表评论需要登录)