GCC,全称GNU Compile Collection,也就是一个编译套装。通常来看,gcc是用来编译C的,g++是用来编译C++的。从用法上来看这是没错的,但这种认识是比较片面的。

需要认识到的第一个原理是,g++最终调用的还是gcc,换句话说,gcc才是最终的编译器。

接下来从三个方面来讲述两者的区别:

  1. 对待源文件(编译阶段),gcc对待.c文件将其当作C程序,对待.cpp文件将其当作C++程序;g++对待.c.cpp文件一律当作C++程序处理
  2. 链接标准库(链接阶段),gcc默认只会连接到标准C库;g++可以自动连接到标准C库和标准C++库。但是gcc可以用-l参数添加C++标准库,像这样-lstdc++,这样的话gcc也可以编译C++了。
  3. 关于__cpluscplus宏定义。gcc会根据源文件后缀名去判断是否要定义这个宏;g++会直接定义这个宏,但是这并不影响它可以正常编译C程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
gcc a.cpp -o a
/usr/bin/ld: /tmp/cc6TWnM5.o: warning: relocation against `_ZSt4cout' in read-only section `.text'
/usr/bin/ld: /tmp/cc6TWnM5.o: in function `main':
a.cpp:(.text+0x11): undefined reference to `std::cout'
/usr/bin/ld: a.cpp:(.text+0x19): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/usr/bin/ld: a.cpp:(.text+0x20): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
/usr/bin/ld: a.cpp:(.text+0x2b): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status

gcc a.cpp -l stdc++ -o a

./a
Hello World