目录
前言:
1.gcc生成静态库.
从使用者的角度出发,如何使用别人的静态库?
方法1:
方法2:直接使用静态库
2.gcc生成动态库
动态库的使用:
第二种方法:(与使用静态库的方法一样)
解决方案:
方法3: ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新
关于动态库与静态库的补充:
对于动静态库,在以后的工作中一定会使用到,因此了解如何打包和使用是十分必要的事,不妨花几分钟来看看!
首先,从发布静态库的角度出发,我们需要打包哪些文件?
1. .o文件
2. .h文件
实例:
首先创建.c和.h文件。
再通过指令 gcc -c myadd.c(文件名) -o myadd.o(文件名)
得到.o文件。
再将.o文件打包成静态库.a
指令: ar -rc libmyadd.a(以lib开头的静态库名) myadd.o(需要打包的.o文件)
最后一步:
从发布者的角度出发,我们需要将 静态库.a 和头文件.h进行打包,这样别人才能正常使用。
有一个myadd(可以理解为是静态库的名),在myadd的目录下,包括include文件夹和lib文件夹。
include文件夹中存放.h文件。
lib文件夹中存放.a文件。
完成以后就大功告成了!
将这个库直接拷贝到系统路径下(如果是自己写的库,不建议这样做)
其中头文件gcc的默认搜索路径在 /usr/include
其中库文件的默认搜索路径在 /usr/lib64 or /lib64
拷贝以后,就可以直接编译我们所写的.c文件了吗? 当然不可以!
由于我们所写的库是第三方库,在编译的时候,还需要一步操作。
gcc mytest.c -lmyadd(去掉lib和.a的库名)
通过指令 gcc xxx.c -I(大写i) +头文件目录 -L +库文件目录(.a文件) -l(小写L)库文件名
就可以直接使用了。
实例:
gcc mytest.c -I ./myadd/include -L ./myadd/lib -lmyadd 即可
与静态库相似,需要将库文件和头文件进行打包,不过动态库的后缀名是.so
首先生成.o文件
gcc -c -fPIC xxx.c -o xxx.o 形成.o文件
再形成库文件:
gcc -shared xxx.o -o lib库名.so
再将头文件和库文件进行打包,分别放入include文件夹,和lib文件夹。
与静态库的使用方法类似。
动态库编译以后的可执行程序,并不能直接运行
会弹出无法加载动态库。
这是为什么呢?不是已经告诉了动态库的位置了吗?为什么还是没办法加载呢?
原因在于,我们只是在gcc的时候,告诉了gcc,动态库的位置,但是并没有告诉系统动态库的位置。
更改 LD_LIBRARY_PATH,将动态库的位置添加到这个路径下。
1.如果对于同一个lib文件夹中,同时存在同名的静态库和动态库,在编译时,会优先选择动态库!
2.如果执意选择静态库,则需要在编译的时候添加 -static选项!
3.如果10个进程都有同一个静态库,那么运行的时候,会有9份重复的代码,而动态库则不会出现这样的情况。