gcc/g++

1/什么是gcc/g++?

gcc / g++ 是gnu中的c / c++编译器 。
gcc 常用于编译c文件,g++常用于编译c++.
编译器是根据gcc还是g++来确定,是按照C标准还是C++标准编译链接。


gcc 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展),利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。
但是,gcc 命令只能编译 C++ 源文件,而不能自动连接 C++ 程序使用的库。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该命令会自动调用 gcc 实现编译。


2/gcc/g++ 的使用方式
gcc/g++ [option] files

(使用 man g++,可以查阅说明文件)
NAME
       gcc - GNU project C and C++ compiler


SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-Wpedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...


       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly the same options as gcc.
编译源文件,生成可执行文件,需要以下4步:
1)预处理,生成.i的文件[预处理器cpp]
比如,g++ -E main.cpp >main.i
执行后,就会生成main.i 文件
2)将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]
比如,g++ -S main.cpp 
执行后,就会生成main.s 文件
3)由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
比如,g++ -c main.cpp
执行后,就会生成main.o 文件
4)连接目标代码,生成可执行程序[链接器ld]
g++ main.o -L F:\vs2008\VC\include\iostream
将.o文件与所需的库文件链接整合形成.exe文件,这就是可执行文件。


常用options
-E
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.
-S
  只激活预处理和编译,就是指把文件编译成为汇编代码
-c
  只激活预处理,编译,和汇编,也就是只把程序生成obj文件
-o
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out。
-Dmacro
  相当于C语言中的#define macro
  
-Dmacro=defn
  相当于C语言中的#define macro=defn
  
-Umacro
  相当于C语言中的#undef macro
-undef
  取消对任何非标准宏的定义
-Idir
  在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,会到缺省的头文件目录找,如果使用-I制定了目录,
  会先在你所制定的目录查找,然后再按常规的顺序去找.
  对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找


-I-
  就是取消前一个参数的功能,所以一般在-Idir之后使用
-C
  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
-M
  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c来测试一下,很简单。
  
-MM
  和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。
  
-MD
  和-M相同,但是输出将导入到.d的文件里面
  
-MMD
  和-MM相同,但是输出将导入到.d的文件里面
-llibrary
  制定编译的时候使用的库
-Ldir
  制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然
  编译器将只在标准库的目录找。这个dir就是目录的名称。
-include file
  包含某个代码,简单来说,就是方便某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include<filename> 


-O0
-O1
-O2
-O3
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高     
-g
  只是编译器,在编译的时候,产生调试信息。
-ggdb
  此选项将尽可能的生成gdb的可以使用的调试信息
-static
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
动态连接库,就可以运行.
-share
  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-traditional
  试图让编译器支持传统的C语言特性

备注:
在编译过程中,gcc/g++会给我们报各种错误。主要集中在编译和链接两步。
语法错误和声明问题会在编译这一步给出。定义问题会在链接这一步给出。


常用debug Option

-Wall

这个命令会打开如下Option:

unused-function:遇到仅声明过但尚未定义的静态函数时发出警告。
◆unused-label:遇到声明过但不使用的标号的警告。
◆unused-parameter:从未用过的函数参数的警告。
◆unused-variable:在本地声明但从未用过的变量的警告。
◆unused-value:仅计算但从未用过的值得警告。
◆Format:检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致。
◆implicit-int:警告没有规定类型的声明。
◆implicit-function-:在函数在未经声明就使用时给予警告。
◆char-subscripts:警告把char类型作为数组下标。这是常见错误,程序员经常忘记在某些机器上char有符号。
◆missing-braces:聚合初始化两边缺少大括号。
◆Parentheses:在某些情况下如果忽略了括号,编译器就发出警告。
◆return-type:如果函数定义了返回类型,而默认类型是int型,编译器就发出警告。同时警告那些不带返回值的 return语句,如果他们所属的函数并非void类型。
◆sequence-point:出现可疑的代码元素时,发出报警。
◆Switch:如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告(在switch语句中使用default分支能够防止这个警告)。超出枚举范围的case语句同样会导致这个警告。
◆strict-aliasing:对变量别名进行最严格的检查。
◆unknown-pragmas:使用了不允许的#pragma。
◆Uninitialized:在初始化之前就使用自动变量。

-Werror

这个Option,可以把Warning 当作Error处理。

3/执行可执行程序

./main.exe


参考:
http://blog.csdn.net/woshinia/article/details/11060797

http://blog.csdn.net/sky453589103/article/details/43530785
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值