加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

gcc 常用 编译 开关/选项

(2012-06-11 08:49:55)
标签:

杂谈

分类: Technical
-v
    (在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号. 

-pipe
    在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的 汇编器不能从管道读取数据. GNU的汇编器没有这个问题.

-nostdinc
    不要在标准系统目录中寻找头文件.只搜索`-I'选项指定的目录(以及当前目录,如果合适).

-nostdinc++
    不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg++'时使用 这个选项.) 

-E
    仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件.

-C
    告诉预处理器不要丢弃注释.配合`-E'选项使用.

-M  [ -MG ]
    告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件.生成的规则可以是单行,但如果太长,就用`\'-换行符续成多行.规则 显示在标准输出,不产生预处理过的C程序.
    `-M'隐含了`-E'选项.

-MD
    和`-M'选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.o'替换为 `.d'产生.同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常的编译任务.

-H
    除了其他普通的操作, GCC显示引用过的头文件名

-Dmacro
    定义宏macro,宏的内容定义为字符串`1'.

-Dmacro=defn
    定义宏macro的内容为defn.命令行上所有的`-D'选项在 `-U'选项之前处理.

-Umacro
    取消宏macro. `-U'选项在所有的`-D'选项之后处理

-dM
    告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E'选项使用.

-w
    禁止所有警告信息. 

-W
    对下列事件显示额外的警告信息: 
   *
    非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变. 这些警告仅在优化编译时发生. 编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个 信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得到警告,因为无法在可能出现问题 的地方调用longjmp.
   *
    既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:
foo (a)
{
  if (a > 0)
    return a;
}
    由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现 虚假警告.
   *
    表达式语句或逗号表达式的左侧没有产生作用(side effect).
如果要防止这种警告,应该把未使用的表达式强制转换 为void类型.例如,这样的表达式`x[i,j]'会导致警告,而`x[(void)i,j]'就不会.
   *
    无符号数用`>'或`<='和零做比较. 

-Wunused
    如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.

-Wformat
    检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致.

-Wuninitialized
    在初始化之前就使用自动变量.

-Wall
    结合所有上述的`-W'选项.通常我们建议避免这些被警告的用法,我们相信,恰当结合宏的使用能够 轻易避免这些用法。

-g
    以操作系统的本地格式(stabs, COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息.

生成特定格式的文件:
-E          只激活预处理,但不生成文件,需要把它重定向到一个输出文件里面。例子: 
             gcc -E hello.c > pianoapan.txt 
       gcc -E hello.c | more


-C         在预处理的时候,不删除注释信息,一般和-E使用,有时候用这个分析程序很方便。 


-S         只激活预处理和编译,就是指把文件编译成为汇编代码。 

       例子: gcc -S hello.c 


-c          只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 

      例子: gcc -c hello.c 


-o          指定目标文件名称,例子:

      gcc -o hello hello.c

包含头文件和库: 
-include file 
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include<filename>,例子用法: 
  gcc hello.c -include /root/pianopan.h 


-Idir
  指定所需头文件的位置,在使用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他会先在所指定的目录查找,然后再按常规的顺序依次查找。
-I-                 参数“-Idir”的功能,所以一般在-Idir之后使用。 


-Ldir 
  指定编译时,库的搜索路径。第三方或自己提供的库,可以用它制定目录,否则编译器将只在标准库的目录找。这个dir就是目录的名称。 


-llibrary 
  制定编译的时候使用的库(指定了路径当然还得指定库名),常用的lib库有lpthread(线程库),lm(数学库),lz(zlib库)及lcrypto(linux下的MD5加密库)等,当然可以添加自己或第三方的库文件。例子:
  gcc -lncurses hello.c               使用ncurses库编译程序。

优化选项:
-O0/1/2/3/s               介绍如下:


-O0                  不进行优化处理。


-O/O1 GCC将执行减少代码尺寸和执行时间的优化,对于那些会严重影响编译时间的优化选项,这个级别的优化并不会执行。


-O2                  在这一级别GCC将会提供所有支持的优化,但这其中并不包括以空间换时间的优化手段,例如编译器不会使用循环展开和函数内联。和-O相比,该选项进一步加快了编译时间和生成代码的性能。


-O3                  除了-O2提供的优化选项外,还指定了-finline-functions,-funswitch-loops和-fgcse-afer-reload选项,目的只有一个就是全力执行代码优化,但是用"-O3 -fno-inline-functions"既可以使用-O3的功能又关闭函数内嵌功能。


-Os                  这个选项是专门用来优化代码尺寸的,-Os打开了所有-O2级别中不会显著增长代码尺寸的优化选项 在用GDB调试优化后的程序时,运行时的指令和你所编写指令就有不一样,也就会出现你所想象不到的结果。对付这种情况时,需要在编译程序时关闭编译优化。  

宏定义:
                   -DMACRO                         以字符串“1”(默认值)定义 MACRO 宏。
                   -DMACRO=DEFN              以字符串“DEFN”定义MACRO 宏,注意中间不能有空格。
                   -UMACRO                         取消对 MACRO 宏的定义。

语言选项(LANGUAGE OPTIONS): 
-ansi

支持符合ANSI标准的C程序。


 

-frtti    开启RTTI的支持(dynamic_cast和typeid需要用到),和vs c++不同,这在gcc中是默认选项。使用"-fno-rtti"将其禁用。


-fno-builtin

       不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exitabortabsallocacosexitfabslabsmemcmpmemcpysinsqrtstrcmpstrcpy,strlen有时候上面的这些函数在一些地方被built-in后,会产生运算结果和预想的不一样甚至是错误的,比如abs(),会导致-10*abs(x-1)== 10*abs(x-1)的怪异情况,原因是运算被优化而得到错误的结果

警告选项:

 

-W               编译器的警告设置参数,拥有众多的选项,下面举一些常用的例子:
     -Woption 让编译器给出option指定的编译警告,常用的一些如下:
                   unused-function: 遇到仅声明过但尚未定义的静态函数时发出警告。
                   unused-parameter: 从未用过的函数参数的警告。
                   unused-variable: 在本地声明但从未用过的变量的警告。
                   unused-value: 经计算但从未用过的值得警告。
                   return-type: 对函数返回类型不当的警告。
                   uninitialized:在初始化之前就使用自动变量。
                   float-equal:   比较两个浮点数是否相等。


    
-Wall       给出“几乎”所有的编译器警告,注意是“几乎”。下面是一些-Wall没有输出的警告类型:
                   sign-compare:将有符号类型和无符号类型数据进行比较时发出警告。
                   unreachable-code:如果发现从未执行的代码时给出警告。
                   inline:如果某函数不能按要求内嵌(inline),则无论是函数声明为inline或者是指定了-finline-functions 选项,编译都将发出警告。      
    -Werror               把所有的警告都视为错误处理。
    -Wno-option               如果我们不想输出某些警告信息,可以使用此参数形式,比如:
                   -Wno-unused-function
                   -Wno-unused-variable
                   -Wno-unused-parameter
                   -Wno-uninitialized

调试和可执行文件形式:
-g                 指示编译器,在编译的时产生调试信息。 


-ggdb           此选项将尽可能的生成gdb的可以使用的调试信息(比-g生成的信息更多些)。


-pg               此选项在运行后生成一个分析文件gmon.out分析每一个模块的运行时间等信息,可以用“gprof execname gmon.out”命令打开。


-static           此选项将禁止使用动态库,编译得到的程序会比较大,但可以自由运行。 


-share          此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。

上面的是一些常用的参数以及对应的选项,如有更细致的需求,可以参考man page。

附加:使用GCC生成静态链接库或动态链接库
         首先需要目标文件(*.o),用gcc/g++ -c生成,如:gcc -c test1.c test2.c test3.c


1. 生成静态链接库
         使用ar命令: ar -crv libtest.a test1.o test2.o test3.o 即可产生test.a文件。
         可以用命令 nm test.a 来看里面的目标文件和导出函数(带 T 标记)。
         使用的时候加上:-L(路径) -ltest。注意这里不是llibtest.a或llibtest,-l参数会自动添加lib和.a到首尾,然后去-L指定的目录加载.a文件。


2.生成动态链接库
         用动态库的好处是:更新了动态库之后链结它的程序不用重新编译,但需要运行时链接。
         使用 gcc -o libtest.so -shared -fPIC      test1.o test2.o test3.o
         -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程需要,而不能达到真正代码段共享的目的。
         可以用命令 nm test.so 来看里面的目标文件和导出函数(带 T 标记)。

         还有一个需要注意的地方,在不同的硬件架构和位宽平台上的.a文件和.so文件不能互用,需要重新生成不同平台的.o文件,然后再生成相应的.a文件和.so文件。否则编译会出现“skipping incompatible ****.a/so”之类的错误。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有