gcc常用选项

来源:互联网 发布:淘宝客服这个工作好吗 编辑:程序博客网 时间:2024/05/16 08:56

   -Idir  将dir中头文件添加到工程中(注意是大写的 i 加上路径),这个路径可以是相对路径,也可以是绝对路径,相对路径就是表示以当前Makefile来做相对-lname                                                                                        (注意是小写的 L加上库名)这种方式是链接程序时,使用到了名字为name的库(静态或者动态)。如果你在链接时使用到了动态库,那么需要将这个动态库导入到系统lib中(有兴趣的可以查找下ldconfig这个命令)。或者修改LD_LIBRARY_PATH环境变量。如果使用的是静态库,那么程序运行时不需要将静态库导入到系统lib中。当然使用动态库编译出来的程序体积要小。-Ldir1将指定目录中的动态链接库加入到编译环境中,如果链接时,会从这个加入的目录中寻找动态库。-g表示编译时,程序中带调试信息,支持gdb调试,如果不加-g,那么gdb是无法调试你的程序的。-Wall  表示开启gcc能够提供的警告信息。-On 其中n表示一个数值,表示优化级别,通常用-O2。static表示链接时,只使用静态库,如果需要链接的库名只有动态库而没有静态库,那么会报错。-share我在使用这个命令的时候,gcc报错,说无法识别这个参数。网上看到很多人说gcc有这个参数,反正我是没用上。有待考证-shared  表示生成动态库,如gcc test.c -fPIC -shared -o libtest.so 。 如果test.c用到了别的库,那么在编译动态库时,还需要指定动态库名称。
如test.c中调用了libhello.so中的函数。那么使用下面命令编译(假设libhello.so就在test.c目录中)
gcc test.c -fPIC  -shared -o libtest.so -L. -lhello-DBT_DEBUG 表示给这个工程定义一个宏,宏的名字是 BT_DEBUG。这个很有用,在程序开发中会加入很多log信息,但是在产品中却不需要那么多log信息,借助编译器这个参数,可以编译出带log和不带log的程序。


下面使用3个简单的源文件进行测试,三个文件的位置关系是:

[root@AY140517072824856a84Z test]# ls -ltotal 12-rw-r--r-- 1 root root   63 Jun 14 20:51 add.c-rw-r--r-- 1 root root  155 Jun 14 19:51 hello.cdrwxr-xr-x 2 root root 4096 Jun 14 20:57 static
[root@AY140517072824856a84Z test]# ls -l ./static/total 4-rw-r--r-- 1 root root 40 Jun 14 19:52 del.c

明白了吧。hello.c和add.c是文件,static是目录,这三个在同级目录,而static目录中有个文件时del.c。

源文件hello.c:

#include <stdio.h>int main(){        printf("1 + 2 = %d\n",add(1,2));        printf("5 - 8 = %d\n",del(5,10));        return 0;}

源文件add.c:

#ifdef BT_DEBUGint add(int a,int b){        return (a-b);}#endif

源文件del.c:

int del(int a,int b){        return (a-b);}

如上面3个文件所示,main函数在hello.c中。而add.c文件中有个预处理指令用来测试-D参数。

首先将add.c编译成动态库,不使用-D参数:

#gcc -fPIC -shared add.c -o libadd.so

带-D参数再次编译add.c。生成的库名为libdadd.so

#gcc -fPIC -shared add.c -o libdadd.so -DBT_DEBUG

接下来编译static目录中的del.c。将其编译成静态库,方法如下:

#gcc -c static/del.c  -o ./static/del.o#ar cr ./static/libdel.a ./static/del.o

接下来编译hello.c文件,并做链接生成可执行程序。首先使用libadd.so作为链接(这个不带-D参数编译出来的动态库),执行结果如下:
[root@AY140517072824856a84Z test]# gcc hello.c -L. -L./static -ladd -ldel/tmp/ccc3mopN.o: In function `main':hello.c:(.text+0x14): undefined reference to `add'collect2: ld returned 1 exit status[root@AY140517072824856a84Z test]# 
如上面所示,找不到add这个函数。为什么?因为没有带-DBT_DEBUG。导致没有这个宏,那么add.c中就不会编译add这个函数了。接下来使用libdadd.so库做链接。

#gcc hello.c -L. -L./static -ldadd -ldel

这次顺利通过。执行结果如下:

[root@AY140517072824856a84Z test]# ./a.out ./a.out: error while loading shared libraries: libdadd.so: cannot open shared object file: No such file or directory[root@AY140517072824856a84Z test]# 

提示找不到libdadd.so这个动态库。使用动态库作连接的,需要将动态库导入系统lib中,或者设置LD_LIBRARY_PATH。下面设置这个变量:

export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

再次运行:

[root@AY140517072824856a84Z test]# ./a.out 1 + 2 = -15 - 8 = -5[root@AY140517072824856a84Z test]# 

如上面所示,del为静态库,dadd为动态库。那么如果在编译hello.c时,加上-static会出现什么情况?

[root@AY140517072824856a84Z test]# gcc hello.c -L. -L./static -ldadd -ldel -static/usr/bin/ld: cannot find -ldaddcollect2: ld returned 1 exit status[root@AY140517072824856a84Z test]# 
如上面信息所示.-ldadd是动态库,所以加上-static后,链接时不会寻找动态库。




0 0