在windows下动态连接库是以.dll后缀的文件,二在Linux中,是以.so做后缀的文件。linux
动态连接库的好处就是节省内存空间。
一、Linux下建立动态连接库
在使用GCC编译程序时,只需加上-shared选项便可,这样生成的执行程序即为动态连接库。
例若有文件:hello.c x.h main.cwindows
[plain] view plain copy.net
其中-fPIC选项的做用是:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,
因此动态载入时是经过代码拷贝的方式来知足不一样的调用,而不能达到真正的代码段共享的目的.
将main.c与hello.so动态库命令行
[plain] view plain copyblog
1、动态连接库内存
1.建立hello.so动态库文档
[cpp] view plain copyget
2.hello.h头文件编译器
[cpp] view plain copyit
3.连接动态库
[cpp] view plain copy
这里-L的选项是指定编译器在搜索动态库时搜索的路径,告诉编译器hello库的位置。"."意思是当前路径.
3.编译成够后执行./main,会提示:
[plain] view plain copy
这是由于在连接hello动态库时,编译器没有找到。
解决方法:
[plain] view plain copy
这样,再次执行就成功输入:
call hello()
2、静态库
文件有:main.c、hello.c、hello.h
1.编译静态库hello.o:
[plain] view plain copy
2.把目标文档归档
[plain] view plain copy
程序ar配合参数-r建立一个新库libhello.a,并将命令行中列出的文件打包入其中。这种方法,若是libhello.a已经存在,将会覆盖如今文件,不然将新建立。
3.连接静态库
[plain] view plain copy
这里的-static选项是告诉编译器,hello是静态库。
或者:
[plain] view plain copy
这样就能够不用加-static
4.执行./main
输出:call hello()
3、借助自带的ldd实现程序来分析动态库搜索状况
ldd main
结果: linux-gate.so.1 => (0x00efd000) libhello.so => /usr/lib/libhello.so (0x00f6b000) libc.so.6 => /lib/libc.so.6 (0x001a5000) /lib/ld-linux.so.2 (0x00eb8000) 若是目标程序没有连接动态库,则打印“not a dynamic executable”