Linux编译选项&静态库和动态库

GCC编译器编译选项:

-c 仅执行预处理、编译和汇编,生成可定位目标文件。

-S 仅执行预处理和编译,生成汇编文件。

-E 仅执行预处理,预处理结果输出至标准输出。

-ansi 关闭GNU C中和ANSI C不兼容的语法特征。

-Dmacro 相当于C语言中的#define macro,常见的是打开调试-DDEBUG和打开可重入标志-D_REENTRANT,编译内核模块-DMODULE-D__KERNEL__-DLINUX

-Dmacro=var 相当于C语言中的#define macro var

-nostdinc 告诉编译器不在系统默认的头文件目录中查找头文件,一般和-I联合使用来明确指定头文件的位置。

-Wa, option 将此选项传递给汇编器as

-Wl, option 将此选项传递给链接器ld

-O[0-3] 编译器优化的4个级别,-O0没有优化,-O1为默认,-O3级别最高。

-static 禁止动态链接。

-shared 编译生成动态库。

-g 使程序能被gdb调试。当系统允许生成coredump文件时(默认coredump文件大小为0,即不产生coredump文件,可通过ulimit查看),可通过如下命令查看是哪个程序产生该coredump文件:

file coredump

gdb –c coredump

-fPIC 通常用在编译动态库时生成位置无关的代码(PICposition-independent code)。用readelf查看一个可执行ELF文件时,可以看到它有一个固定的加载地址(虚拟地址)。而动态库则没有固定加载地址,因为对于系统上众多的动态库,编译时无法确定哪个库应该放在内存的哪个位置。

- Wall 打开所有警告信息。

 

 

 

1.       Linux静态库和动态库的命名规则:

静态函数库:静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中。

a)       优点:编译后,可执行文件不需要外部支持;

b)       缺点:生成的可执行程序大;静态库改变了,就需要重新编译可执行程序。

 

动态函数库:动态库的名字一般是libxxx.so,相对于静态库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里面相应的函数,因此使用动态函数库生成的可执行文件比较小。由于函数库没有编译进可执行程序,而是程序运行时动态的申请调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变也不会影响可执行程序,针对可执行程序的动态函数库升级也比较容易。

a)       优点:实现进程的资源共享,当程序在运行的时候需要调用某个动态链接库函数时候,OS会先查看所有正在运行的程序,看内存里面是否已经有此函数的拷贝了,有责共享那个拷贝,没有才会链接载入,这样会大大节省OS的内存资源;

b)       优点:升级容易,升级动态链接库即可,不需要重新编译可执行程序;

 

2.       Gcc/g++的编译链接:

通常,对函数的链接是在编译期的时候完成的,所有相关的对象文件与相关联的library被链接成一个可执行文件,这就是使用静态库的编译过程,

而动态库技术:对一些库函数的链接载入推迟到程序运行的时候。

但是,不管是使用静态库还是使用动态库,这些库文件都是由*.o文件生成的,在给编译器gcc传不同的参数,就会生成相应的静态库或者是动态库了。

 

3.       静态库和动态库的创建过程:

a)       创建静态库:

在linux环境下,创建静态库是使用ar命令,具体的选项可以man查看下,例子:

ar  -rt libtest.a   error.o  show.o  test.o

这样就创建了libtest.a静态库文件。

 

b)       创建动态库:

使用gcc编译.c文件的使用,使用-fPIC标签,然后在使用*.o文件生成动态库文件的时候,传递-shared标签给gcc,例子:

Gcc  –fPIC  –c  file1.c

Gcc  -fPIC  -c  file2.c

Gcc  –shared  libtest.so  file1.o  file2.o

这样就创建了libtest.so动态库文件。

 

4.       使用静态库和动态库的方法:

动态库文件和静态库文件的使用方法基本上差不多,在gcc的command里面使用-Lpath和-lxxx标签:

Gcc file1.o file2.o –Lpath –lxxx –o yourprogrammer

编译器会先到path下面寻找libxxx.so文件,如果没有找到,继续寻找libxxx.a文件。

那么动态库函数文件,是在程序运行的过程中决定是否载入的,那么我们需要告诉编译器,去哪里能找到动态库函数文件,在linux或者类unix操作系统里面是使用LD_LIBRARY_PATH环境变量来实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值