您好,欢迎来到图艺博知识网。
搜索
您的当前位置:首页Linux初阶——动静态库

Linux初阶——动静态库

来源:图艺博知识网

一、静态库(格式:libxxx.a)

1. 原理

  • 在运行之前就已经把函数的实现代码拷进 main.c 文件里了,因此静态库的权限是没有可执行权限的,因为根本不会执行到静态库里的内容。
  • 静态库的创建原理本质上就是把所有的函数源文件编译成 *.o 文件后,再把所有的 *.o 文件合成一个库,而这个库就是静态库。

2. 创建

在 makefile 中可这样创建:

lib=libmylib.a

$(lib):add.o
    ar -rc $@ $^
add.o:add.c
    gcc -c $^

.PHONY:clean
clean:
    rm -rf *.o *.a a.out mylib

.PHONY:output
output:
    mkdir -p mylib/include
    mkdir -p mylib/libs
    mv *.h mylib/include
    mv *.a mylib/libs

3. 使用

a. 头文件 & 库的区别

  • 头文件是以 .h 结尾的文件
  • 库是以 .a 结尾的文件

b. 命令(gcc -I -L l...)

// 假如要对 /lib/libmylib.a 进行静态连接
gcc -I <头文件的路径> -L <静态库的路径> -lmylib

二、动态库(共享库)(格式:libxxx.so)

1. 原理

2. 创建

在 makefile 中可这样创建:

lib=libmylib.so

$(lib):add.o
    gcc -shared -o $@ $^
add.o:add.c
    gcc -fPIC -c $^

.PHONY:clean
clean:
    rm -rf *.o *.so a.out mylib

.PHONY:output
output:
    mkdir -p mylib/include
    mkdir -p mylib/libs
    mv *.h mylib/include
    mv *.so mylib/libs

3. 使用

// 假如要对 /lib/libmylib.so 进行静态连接
gcc -I <头文件的路径> -L <动态库的路径> -lmylib

补充:

如果你的头文件已经在系统查找头文件的默认路径(/usr/include/)下,那就可以不带 -I 选项;同时,如果你的库文件已经在系统查找库文件的默认路径(/usr/lib/)下,那也可以不带 -L 选项。 

4. 优势

因为动态链接的库可以实现多进程共享,因此可以减少内存的使用。

5. 动态库如何从磁盘加载到内存?

(1)动态库如何载入内存?

如果动态库已经在内存里了,那就直接向当前进程的页表添加映射关系;然后动态库的代码载入该进程的共享区;然后进程就可以访问动态库的代码啦~

(2)进程如何访问动态库的代码?(通过相对地址)

6. 解决动态库加载问题

或许你会有一个疑问:为什么前面 gcc 那里已经指明了动态库的头文件路径和库的路径,系统还是会报错说找不到库?其实很简单,就是你只是告诉了 gcc 去哪个路径找头文件和库,可是最后链接的事是由操作系统的加载器来做的,而你并没有告诉操作系统的加载器你库的路径,因此你可以通过一下方式来告诉系统(加载器)库的路径:

  • 把库放到程序搜索库的默认文件里,如 /lib
  • 把库与程序搜索库的默认文件建立软连接,如 mylib -> /lib
  • 把自己的库路径添加到环境变量 LD_LIBRARY_PATH 中
  • 在 /etc/ld.so.conf.d 中建立自己的配置文件,然后重新 ldconfig 即可(永久有效)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuoyibo.net 版权所有 湘ICP备2023021910号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务