C++环境与编译器
常用编译器
一、基本介绍
GCC(GNU Compiler Collection)
由GNU项目开发,历史悠久,最初是GNU C编译器,后来支持C++、Fortran、Go等多种语言。
在Linux和许多Unix系统上是默认编译器。
Clang
是LLVM项目的一部分,由苹果、Google等支持,目标是替代GCC,提供更快的编译速度和更好的错误提示。
在macOS上是默认编译器,也可在Linux/Windows使用。
二、主要区别
三、实际开发中的选择
在Linux上,GCC用得最多,但Clang也支持得很好。
在macOS上,推荐用Clang,因为系统头文件和库都是为Clang设计的。
在Windows上,两者都可以用(但MSVC用得更多)。
CMake等跨平台工具,可以自由选择GCC或Clang。
四、简单总结
GCC = 历史悠久,Linux默认,兼容性好。
Clang = 新一代,错误提示友好,macOS默认,编译快。
五、适合谁用?
普通开发者:用默认的编译器就好(Linux用GCC,macOS用Clang)。
需要跨平台/高质量错误提示的开发者:可以优先考虑Clang。
做底层开发、嵌入式等:GCC支持的架构更多。
在实际使用时的命令
g++ 和 clang++ 在大多数日常使用场景下,命令行用法几乎完全一样。只需要把 g++
换成 clang++
,参数和用法都一样。
常见命令对比
补充说明
g++ 和 clang++ 都是 C++ 编译器的命令行前端,参数设计基本一致,都是遵循 GCC 的风格。
绝大多数 CMake、Makefile、脚本都可以直接把
g++
替换为clang++
,无需修改参数。两者都可以编译 C++11/14/17/20/23 等各种标准。
如果你用的是 C 语言,用
gcc
和clang
(同理)。
例子
编译并运行一个 C++ 程序:
g++ main.cpp -o app
./app
或者
clang++ main.cpp -o app
./app
只编译,不链接:
g++ -c main.cpp -o main.o
clang++ -c main.cpp -o main.o
链接多个目标文件:
g++ main.o util.o -o app
clang++ main.o util.o -o app
总结
命令行参数基本一致,随时可以互换。
只有极少数高级参数(如特定优化、诊断参数)会有差异,日常开发不用担心。
个人使用时
我现在用的是M系列芯片的mac,但当我看到大家或者说视频中都在使用gcc所以我就安装了gcc,但是在后续使用中陆陆续续的也都出现了问题,自己一直没有搞明白,对CMake也是一点都不懂,从今天开始突然决定要系统理解一下。还有就是万能头文件无法在clang++中使用。
万能头文件
1. <bits/stdc++.h>
是什么?
这是GCC(g++)专有的一个“万能头文件”,会一次性包含绝大多数 C++ 标准库头文件。
它不是 C++ 标准库的一部分,只在 GCC 下有效,不是跨平台的。
2. Clang++ 支持 <bits/stdc++.h>
吗?
在 macOS 下的 clang++,默认没有这个头文件。
在 Linux 下,如果你用 clang++ 编译器,但用的是 GCC 的库路径(比如
/usr/include/c++/X.Y.Z/bits/stdc++.h
),是可以找到的。在 macOS 下,因为系统用的是 libc++,没有 bits 这个目录,所以会报错
fatal error: 'bits/stdc++.h' file not found
。
3. 怎么办?
推荐做法:
不要依赖
<bits/stdc++.h>
!
写代码时,按需包含标准头文件,比如:
#include <iostream>
#include <vector>
#include <algorithm>
这样代码可读性高,移植性好,任何编译器都支持。
如果只是在本地练习想偷懒:
你可以自己写一个类似的头文件,比如叫 my_stdcpp.h
,内容如下:
// my_stdcpp.h
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
// ...按需添加
然后在你的代码里
#include "my_stdcpp.h"
4. 结论
clang++ 没有
<bits/stdc++.h>
,建议不用。按需包含标准库头文件,代码更规范、更通用。
练习时可以自己写一个万能头文件,但不推荐在正式项目里用。