静态库.a
lib文件夹,存放着所有的库。
我们想写了自己的部分功能实现和代码,很多个.0和.h 但是实现文件太多了,我们把它打包在一起就是静态库。
那么如何打包呢?ar命令
ar -rc libhello.a mython.o myprintf.0
r 代表打包 c创建 前面必须有lib后缀有.a
这样就会形成libhello.a的静态库
打包我们可以在makefile里面来写
那么做好只会该怎么发布呢?一般会有一个include文件夹,这个文件夹里面放着所有的头文件,还有lib文件夹,这个文件夹里面放着所有的库文件。
然后把这个文件夹给对方。那么对方怎么用呢?
gcc 头文件的默认搜素目录是/usr/include
库文件搜索目录/lib64或usr/lib64
自己写的库属于第三方库,编译的时候要
gcc main.c -lhello
-l 代表链接库 去掉前缀和.a写的时候
把头文件和库文件,拷贝到库里面这样子叫库的安装。
如果指定目录,不在对应的库目录里面需要使用I 指定头文件目录和库文件目录
gcc main -I./hello/include/ -L./hello/lib/ -hello
静态库是把代码拷贝到文件里面,一旦生成文件之后,更新之后需要重新编译
动态库.so
动态库生成的时候需要加fPIC
gcc -fPIC -c myfile.c myfile.o
fPIC :形成与位置无关的二进制目标文件
静态库是加载是时候需要拷贝到文件之中,必须在特定位置中拷贝好才能使用。而动态库则不用。readelf -S可以查看生成文件使用了那些库。
打包动态库
gcc -shared myprint.o myhello.o libhello.so
这样子可以形成动态库.so文件
同时生成静态库和动态库
使用-l 链接默认的是动态库还是静态库呢?当动静态库的时候默认使用动态库。如果只有静态的时候没办法只能使用静态库。那么如果强制使用静态库呢?需要加 -static。动态库在加载的时候只要建立映射关系就可以了。
但是动态库编译的时候这样子就可以了吗?不可以,gcc编译的时候明白,但是,指向的时候操作系统不知道。那么在运行动态库的时候需要
1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2、更改LD_LIBRARY_PATH
[root@localhost linux]# export LD_LIBRARY_PATH=¥xxxxz自己的库目录
[root@localhost linux]# gcc main.c -lmymath
[root@localhost linux]# ./a.out
add(10, 20)=30
sub(100, 20)=80
或者修改配置文件
一般是在 置/etc/ld.so.conf.d/ 在这个新建xxxx.conf。然后把自己想要添加的动态库目录,然后粘贴到这个配置文件里面,然后ldconfig.
为什么要写库:
大大减少软件开发周期,提高软件的健壮性,提高软件本身的质量,代码安全。有一定的加密成分。