菜鸟笔记
提升您的技术认知

cc、gcc、g 、cc的区别概括-ag真人游戏

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<字母> 选项。

 

网站地图