[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2017-12-12 标题【转】编译器 cc、gcc、g、CC 的区别分类编程 / C C 标签linux·CC【转】编译器 cc、gcc、g、CC 的区别本文转自【 https://www.cnblogs.com/52php/p/5681725.html 】gcc 是GNU Compiler Collection原名为Gun C语言编译器因为它原本只能处理C语言但gcc很快地扩展包含很多编译器C、C、Objective-C、Ada、Fortran、 Java可以说gcc是GNU编译器集合。g 是C编译器。cc 是 Unix系统的 C Compiler一个是古老的 C 编译器。而 Linux 下 cc 一般是一个符号连接指向 gcc可以通过 $ ls -l /usr/bin/cc 来简单察看该变量是 make 程序的内建变量默认指向 gcc 。 cc 符号链接和变量存在的意义在于源码的移植性可以方便的用 gcc 来编译老的用cc编译的Unix软件甚至连 makefile 都不用改在而且也便于 Linux 程序在 Unix下 编译。CC 则一般是 makefile 里面的一个名字标签即宏定义表示采用的是什么编译器如CC gcc。误区一gcc只能编译C代码g只能编译C代码。两者都可以但请注意1后缀为.c的gcc把它当作是C程序而g当作是c程序后缀为.cpp的两者都会认为是C程序注意虽然C是C的超集但是两者对语法的要求是有区别的。C的语法规则更加严谨一些。2编译阶段g会调用gcc对于C代码两者是等价的但是因为gcc命令不能自动和C程序使用的库联接所以通常用g来完成链接为了统一起见干脆编译/链接统统用g了这就给人一种错觉好像cpp程序只能用g似的。误区二gcc不会定义__cplusplus宏而g会实际上这个宏只是标志着编译器将会把代码按C还是C语法来解释如上所述如果后缀为.c并且采用gcc编译器则该宏就是未定义的否则就是已定义。误区三编译只能用gcc链接只能用g严格来说这句话不算错误但是它混淆了概念应该这样说编译可以用gcc/g而链接可以用g或者gcc -lstdc。因为gcc命令不能自动和C程序使用的库联接所以通常使用g来完成联接。但在编译阶段g会自动调用gcc二者等价。C的编译器肯定可以编译C的代码注意除了C对C的语法扩充之外编译和链接C和C的标准库通常也不一样呢用gcc而非g也编译了C的程序就证明了这一点。注符号链接是一种特殊类型的文件它的内容只是一个字符串。它可能指向一个存在的文件也可能什么都不指向。当您在命令行或程序里提到符号链接的时候您实际上进入了它指向的文件前提是这个文件是存在的。