gcc生成静态库与动态库(附带使用方法)

目录

前言:

1.gcc生成静态库.

从使用者的角度出发,如何使用别人的静态库?

方法1:

方法2:直接使用静态库

2.gcc生成动态库

动态库的使用:

第二种方法:(与使用静态库的方法一样)

解决方案:

方法3: ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

关于动态库与静态库的补充:


前言:

对于动静态库,在以后的工作中一定会使用到,因此了解如何打包和使用是十分必要的事,不妨花几分钟来看看!

1.gcc生成静态库.

首先,从发布静态库的角度出发,我们需要打包哪些文件?

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进行打包,这样别人才能正常使用。

gcc生成静态库与动态库(附带使用方法)_第1张图片

 有一个myadd(可以理解为是静态库的名),在myadd的目录下,包括include文件夹和lib文件夹。

include文件夹中存放.h文件。

lib文件夹中存放.a文件。

完成以后就大功告成了!

从使用者的角度出发,如何使用别人的静态库?

方法1:

将这个库直接拷贝到系统路径下(如果是自己写的库,不建议这样做)

其中头文件gcc的默认搜索路径在 /usr/include

其中库文件的默认搜索路径在 /usr/lib64  or /lib64

拷贝以后,就可以直接编译我们所写的.c文件了吗? 当然不可以!

由于我们所写的库是第三方库,在编译的时候,还需要一步操作。

gcc mytest.c -lmyadd(去掉lib和.a的库名)

方法2:直接使用静态库

通过指令 gcc xxx.c -I(大写i) +头文件目录 -L +库文件目录(.a文件) -l(小写L)库文件名

就可以直接使用了。

实例:

gcc生成静态库与动态库(附带使用方法)_第2张图片

gcc mytest.c -I ./myadd/include -L ./myadd/lib -lmyadd  即可 

2.gcc生成动态库

与静态库相似,需要将库文件和头文件进行打包,不过动态库的后缀名是.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,将动态库的位置添加到这个路径下。

方法3: ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

关于动态库与静态库的补充:

1.如果对于同一个lib文件夹中,同时存在同名的静态库和动态库,在编译时,会优先选择动态库!

2.如果执意选择静态库,则需要在编译的时候添加 -static选项!

3.如果10个进程都有同一个静态库,那么运行的时候,会有9份重复的代码,而动态库则不会出现这样的情况。


 

你可能感兴趣的:(c++,linux,开发语言)