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 }
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静态库文件。