gcc参数记录(一)

本文记录一些gcc相关参数,便于个人记忆,持续更新。

一、 -g

-g 可执行程序包含调试信息。-g 为了调试用的,加入后可用gdb调试。

二、 -o


-o指定输出文件名,格式: -o output_filename,确定输出文件的名称为output_filename,如果未指定会输出为默认文件,比如可执行文件会生成为a.out,目标文件名是source.o,其中source是源文件等。

 

三、-c

-c 只编译不链接

产生.o文件,就是目标文件,不产生执行文件。

 

四、-D


-D的作用是添加宏定义,如-DNDEBUG,作用如下:

NDEBUG 

头文件assert.h定义的宏受NDEBUG的影响。如果预程序在处理这个头文件时已经定义了NDEBUG,assert宏的内容就定义为空,这意味着assert宏不起作用。

所以,可以在最终发布程序的时候可以用-DNDEBUG关闭断言功能或者把#define NDEBUG加每个源文件中,但这条语句必须放在#include <assert.h>之前。

 1 #include <stdio.h>
 2 
 3 #definne NDEBUG
 4 #include <assert.h>
 5 
 6 int main()
 7 {
 8   int x = 0;
 9   assert(x);
10   printf("%d\n",x);
11   return 0;
12 }
View Code

 

trace(),assert()都只是在DEBUG模式下才起作用的,如果定义了NDEBUG,编译器会以为是非DEBUG的模式(虽然编译出来的程序还是很大),而且还可以进行调试,此时trace(),assert()就没有用了。就如同你编译成release版的时候这些没有用一样。

 

#define DEBUG 会重新打开调试开关

NDEBUG宏由于字面意思,也被用于作为判断debug/release版本的宏,不过这个是编译器、环境相关的,并不可靠。比如vc中,对生成的release版本项目,默认定义这个宏,而gcc并没有定义,得用-DNDEBUG参数来定义。

 

五、-w


-w(小写),表示关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译时编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。

 

六、-W和-Wall

-W选项类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告。

-Wall选项意思是编译后显示所有警告。

 

七、-O3


-O(大写),意思开始编译优化,level为3。

 

八、-shared

如果想创建一个动态链接库,可以使用gcc的-shared选项。输入文件可以是源文件、汇编文件或者目标文件。

 

九、-fPIC


-fPIC选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code)。

这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确执行。

这是共享库所要求的,共享库被加载时,在内存的位置是不固定的。

 

十、-I参数与-L参数

-I(大写i)用于指定头文件目录。

  -I /home/xhx/include表示将/home/xhx/include目录作为第一个寻找头文件的目录,寻找顺序是:/home/xhx/include -> /usr/include -> /usr/local/include

-L用于指定程序链接库路径。

  -L/home/xhx/lib表示将/home/xhx/lib目录作为第一个寻找库文件的目录,寻找顺序是:/home/xhx/lib -> /lib -> /usr/lib -> /usr/local/lib

-l (小写l)用于指定链接库名称。

  -lxhx 表示在上面的lib路径中寻找libxhx.so的动态库文件,如果编译选项中加入-static 表示寻找libxhx.a静态库文件。

 

posted @ 2020-05-26 11:42  一瞬光阴  阅读(418)  评论(0编辑  收藏  举报