linux链接库复习
时间: 2024-12-25 15:20:15 浏览: 2
### Linux 链接库教程
#### 一、静态库与动态库的概念
在Linux系统中,程序可以通过链接库来实现功能扩展。这些库分为两种主要类型:静态库和动态库。
- **静态库**是在编译阶段被直接嵌入到可执行文件中的二进制对象集合。这意味着一旦应用程序完成编译并连接上所需的静态库之后,在运行期间不再依赖于外部共享资源[^2]。
- **动态库**(也称为共享库),则只会在加载或调用时才由操作系统映射至内存,并且多个进程能够同时访问同一个副本而无需重复占用磁盘空间或物理RAM。这种机制不仅节省了存储成本,而且有助于减少启动时间和提高性能效率。
#### 二、创建静态库
要构建一个简单的C/C++项目所使用的静态库(.a), 可以按照如下方式操作:
假设有一个名为`mylib.c` 的源码文件:
```c
// mylib.c
#include <stdio.h>
void hello() {
printf("Hello from static library!\n");
}
```
接着通过命令行工具gcc/g++将其编译成目标文件(`.o`) 并打包为`.a` 形式的档案文件(即静态库):
```bash
$ gcc -c mylib.c -o mylib.o
$ ar rcs libmylib.a mylib.o
```
最后, 在其他项目的Makefile 或者构建脚本里指定 `-L.` 参数指向当前目录下的路径以及使用 `-lmylib` 来引入这个新建立好的静态库.
#### 三、创建动态库
对于动态库 (.so 文件) , 创建过程略有不同 :
同样先定义好函数接口所在的 C / C ++ 源代码 `dynlib.c`, 如下所示:
```c
// dynlib.c
#include <stdio.h>
__attribute__((visibility("default"))) void greet(){
puts("Greetings from dynamic shared object!");
}
```
注意这里加上了一个特殊的属性声明 (`__attribute__((visibility("default"))))` ) 确保导出了此方法供外界可见 .
接下来利用 GCC 编译器选项 `-fPIC`(Position Independent Code) 生产位置无关的目标模块再进一步组装成为 .so 动态链接库 :
```bash
$ gcc -shared -fPIC -o libdyn.so dynlib.c
```
此外还需要设置环境变量 LD_LIBRARY_PATH 让加载器知道去哪里寻找自定义的 so 文件 :
```bash
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
```
#### 四、使用预编译的第三方库
除了自己动手制作之外,很多情况下可以直接下载已经过优化处理过的现成版本。比如 OpenSSL 就是非常流行的安全协议栈之一;SQLite 则提供了轻量级的关系型数据库引擎等等。安装这类软件包通常只需要遵循官方文档给出的具体指导即可顺利完成集成工作。
---
阅读全文