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
- 【gcc】gcc常用选项
- gcc, g++ 常用选项
- gcc常用优化选项
- gcc 常用选项
- gcc常用选项小解
- gcc 几个常用选项
- 常用GCC 编译选项
- gcc常用选项
- 常用 GCC 编译选项
- GCC常用编译选项
- gcc 常用编译选项
- gcc常用控制选项
- gcc常用选项
- GCC 常用选项
- GCC常用选项
- gcc常用选项说明
- GCC常用编译选项
- gcc常用选项总结
- this 关键字的使用
- Apache-DBUtils包对数据库的操作
- 条款31:将文件间的编译依存关系降至最低
- this 关键字的使用
- 黑马程序员——Map
- gcc常用选项
- 为SQL 2005中的InterLib添加数据源
- Linux下C编程:gcc和Makefile体验
- 黑马程序员-Java中getResourceAsStream的用法
- Python中MySQLdb模块的安装
- 常见面试之机器学习算法思想简单梳理
- 程序员可以在一天内学习的技术技能
- this 关键字的使用2
- Java Swing界面编程(28)---复选框:JCheckBox