qt creator默认不将clang作为c项目默认编译器,因kit中“clang”套件实际调用clang++(c++前端),需手动配置独立clang路径为c编译器,并在.pro文件中设置qmake_cc = clang及-qmake_cflags += -std=c11 -x c以确保c模式编译。

Qt Creator 默认不把 Clang 当作 C 语言项目的默认编译器,直接选“Clang”套件往往编译失败——根本原因是它默认只启用 clang++(C++ 前端),而 C 项目需要的是 clang(C 前端)或显式指定 -x c。这不是 Qt Creator 的 bug,而是 Clang 工具链本身的行为差异。
为什么 clang++ 编译 C 文件会报错
当你在 .c 文件上点构建,Qt Creator 若调用 clang++,它会按 C++ 规则解析语法:比如把 bool 当关键字、拒绝 K&R 风格函数声明、对隐式函数声明更严格。即使你写了纯 C 代码,clang++ 也会尝试链接 C++ 标准库(libstdc++ 或 libc++),而 C 项目通常不需要,导致链接失败或符号未定义。
-
error: unknown type name 'bool'—— 这是clang++在 C 模式下没开_Bool支持的典型表现 -
undefined reference to 'std::ios_base::Init::Init()'——clang++强行拉入了 C++ 初始化逻辑 - Qt Creator 的 Kit 显示 “Desktop Qt X.X.X clang 64bit”,但实际调用的是
clang++,不是clang
手动指定 clang 作为 C 编译器路径
Qt Creator 的“编译器”配置页允许你为不同语言指定不同二进制文件,关键在于别只填 clang++,要分开配:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 打开 工具 → 选项 → 构建和运行 → 编译器
- 点击
添加 → GCC → 自定义(不要选 Clang,那个模板默认绑死clang++) - 名称填
clang-c,厂商选GNU(仅用于标识,不影响行为) - 编译器路径填
/usr/bin/clang(macOS/Linux)或C:\Program Files\LLVM\bin\clang.exe(Windows) - C 编译器路径必须明确指向
clang,不是clang++;C++ 编译器可另配clang++ - 保存后,在 Kit 配置里把该编译器设为“C 编译器”,保留原有 Clang 套件的 C++ 编译器不变
项目.pro 文件里强制 C 模式
即使编译器路径正确,qmake 仍可能根据源文件后缀(.c)自动加错 flag。你需要显式干预:
- 在
.pro文件中加一行:QMAKE_CC = clang - 如果用了 C11 或更新标准,再加:
QMAKE_CFLAGS += -std=c11 -x c - 禁用 C++ 相关 flag(尤其避免
-xc++或-x objective-c++被误注入) - 检查生成的 Makefile:搜索
clang -c后是否带-x c,没有就说明 qmake 没生效
Clang 诊断提示比 GCC 更严,但别关掉
用 clang 编译 C 项目时,你会立刻看到一堆 implicit declaration of function 或 incompatible pointer types 提示——这不是错误,是 Clang 主动帮你发现潜在 UB。很多老项目靠 GCC 宽松模式苟活,换 Clang 就暴露问题。
- 别急着加
-Wno-implicit-function-declaration掩盖问题 - 优先补全头文件(比如
string.h、stdlib.h),而不是关警告 - Clang 的
-Weverything对 C 项目过于激进,用-Wall -Wextra -Wpedantic更实用 - Qt Creator 的“问题”面板会实时标出这些警告,双击就能跳转,比翻 terminal 快得多
真正麻烦的不是配路径,而是 C 项目里混着 GNU 扩展(如 __attribute__((packed)))、旧式初始化、宏定义污染——Clang 不认这些,得一个个修。配完之后记得 clean rebuild,否则缓存的 .o 文件可能还是用旧编译器生成的。
13万字C语言保姆级教程(深入):立即使用
在学习笔记中,你将探索c语言的核心概念和高级技巧!










