gcc是c编译器;g 是c 编译器;linux下cc一般是一个符号连接,指向gcc;gcc和g 都是gun(组织)的编译器。而cc则一般是makefile里面的一个名字,即宏定义,嘿,因为linux/unix都是大小写敏感的系统,这点一定要注意。
cc是unix系统的c compiler,而gcc则是gnu compiler collection,gnu编译器套装。gcc原名为gun c语言编译器,因为它原本只能处理c语言,但gcc很快地扩展,包含很多编译器(c、c 、objective-c、ada、fortran、java)。因此,它们是不一样的,一个是古老的c编译器,一个是gnu编译器集合,gcc里面的c编译器比cc强大多了,因此没必要用cc。
下载不到cc的原因在于:cc来自于昂贵的unix系统,cc是商业软件。
linux下的cc是gcc符号连接,可以通过$ls –l /usr/bin/cc来简单察看,该变量是make程序的内建变量,默认指向gcc。cc符号链接和变量存在的意义在于源码的移植性,可以方便的用gcc来编译老的用cc编译的unix软件,甚至连makefile都不用改在,而且也便于linux程序在unix下编译。
误区一: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 的程序就证明了这一点。
注:符号链接是一种特殊类型的文件,它的内容只是一个字符串。它可能指向一个存在的文件也可能什么都不指向。当您在命令行或程序里提到符号链接的时候,您实际上进入了它指向的文件,前提是这个文件是存在的。
用法:gcc [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径
-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-xassembler <参数> 将 <参数> 传递给汇编器
-xpreprocessor <参数> 将 <参数> 传递给预处理器
-xlinker <参数> 将 <参数> 传递给链接器
-combine 将多个源文件一次性传递给汇编器
-save-temps 不删除中间文件
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-b <目录> 将 <目录> 添加到编译器的搜索路径中
-b <机器> 为 gcc 指定目标机器(如果有安装)
-v <版本> 运行指定版本的 gcc(如果有安装)
-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-e 仅作预处理,不进行编译、汇编和链接
-s 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
-o <文件> 输出到 <文件>
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言
以 -g、-f、-m、-o、-w 或 --param 开头的选项将由 gcc 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -w<字母> 选项。