clang -c 选项仅执行编译(含预处理、编译、汇编),生成目标文件(如 .o 或 .obj),跳过链接阶段,不检查符号定义、不生成可执行文件;常见错误是误写为 clang main.c -o program(缺 -c,触发默认链接)或混淆 -c 与 -o 的作用。

clang -c 选项就是干这个的
直接用 clang -c 就能只编译、不链接,生成 .o 目标文件。它跳过链接阶段,不检查函数是否定义、符号是否缺失,也不生成可执行文件——这点和 gcc -c 行为完全一致。
为什么用了 -c 还是生成了 a.out?
常见错误:把 -c 和 -o 搞混了,或者漏写了 -c。
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 写成
clang main.c -o program→ 缺少-c,clang 默认会编译 + 链接,生成可执行文件program - 写成
clang -c main.c -o main.o→ 正确,输出目标文件main.o - 写成
clang -c main.c -o program→ 也能成功,但生成的是目标文件program(不是可执行文件),后缀名不重要,内容才是目标文件 - 多个源文件:
clang -c a.c b.c c.c→ 生成a.o、b.o、c.o,各对应一个源文件
链接阶段报错,但 -c 时完全没提示?
这是 -c 的设计行为,不是 bug。编译器只负责语法、语义和生成目标码,不验证跨文件符号引用。
- 比如
main.c调用了未定义的func_b(),clang -c main.c会静默成功 - 等你后续用
clang main.o utils.o链接时,才会报类似undefined reference to 'func_b' - 所以大型项目中,
-c常配合 Makefile 或构建系统使用,先批量编译,再统一链接
Windows 上 clang 生成的是 .obj 还是 .o?
取决于目标平台,不是操作系统本身。
- 默认调用 MinGW 或 MSVC 工具链时,clang 会生成
.obj(Windows PE/COFF 格式) - 用
--target=x86_64-pc-linux-gnu或在 WSL 中运行,生成.o(ELF 格式) - 不必硬记后缀,关键是看是否能被后续的
clang或link.exe/ld.lld正确消费
-c 不做任何链接检查,连标准库函数(如 printf)是否存在都不验证——它只管把当前源文件翻译成目标码。真正出问题,往往要等到最后一步链接才暴露。13万字C语言保姆级教程(深入):立即使用
在学习笔记中,你将探索c语言的核心概念和高级技巧!










