静态库和动态库

简介: 本文详细介绍了静态库和动态库的概念及使用方法。在 Linux 系统中,静态库以 `libxxx.a` 形式存在,而动态库则为 `libxxx.so`。文章分别讲解了如何创建和使用这两种库,并提供了具体的命令示例。此外,还介绍了将库文件添加到系统目录的方法,包括直接复制到默认库路径、修改环境变量以及编辑系统配置文件等方案。适合初学者了解库文件的基本操作。

静态库和动态库

库文件

库是一个二进制文件,是将 xx.c 编译生成的二进制的机器指令,库又分为动态库和静态库。

linux:

静态库 libxxx.a

动态库 libxxx.so

windows:

静态库 xxx.lib

动态库 xxx.dll

静态库

静态库是以 libxxx.a 格式命名的 lib 是前缀 .a 是后缀 xxx 是库名

如果在编译时使用的是静态库,会将静态库中的机器指令编译到可执行文件中,

可执行文件的体积相对较大,执行效率相对较高。

静态库更新操作比较麻烦,需要重新编译生成可执行文件,否则拿不到新的库里的指令

静态库制作

静态库的制作需要将多个.o 文件打包成一个 libxxx.a 文件,

.o 文件是编译生成的目标文件,是二进制机器指令。

gcc -c xxx.c -o xxx.o
gcc -c xxx1.c -o xxx1.o
gcc -c xxx2.c -o xxx2.o

ar -cr   libxxx.a xxx.o xxx1.o xxx2.o

静态库使用

静态库的使用需要在编译时指定静态库的路径,

-I  :指定头文件的路径
-L  : 指定库文件的路径
-l  : (小写的L)指定链接哪个库

gcc main.c   -I include_path  -L lib_path  -lxxx   -o main

动态库

动态库是以 libxxx.so 格式命名的 lib 是前缀 .so 是后缀 xxx 是库名

动态库与静态库的区别在于,动态库在程序运行时才加载,

静态库在编译时就已经加载到可执行文件中,程序运行时不再加载。

动态库的更新操作比较方便,只需要更新库文件,不需要重新编译可执行文件。

动态库制作

动态库的制作需要将多个.o 文件打包成一个 libxxx.so 文件,

.o 文件是编译生成的目标文件,是二进制机器指令。

gcc -c xxx.c -o xxx.o
gcc -c xxx1.c -o xxx1.o
gcc -c xxx2.c -o xxx2.o

gcc -shared -o libxxx.so xxx.o xxx1.o xxx2.o
或者
gcc -shared -fPIC -o libxxx.so xxx.c xxx1.c xxx2.c

动态库使用

动态库的使用需要在编译时指定动态库的路径,

-I  :指定头文件的路径
-L  : 指定库文件的路径
-l  : (小写的L)指定链接哪个库

gcc main.c   -I include_path  -L lib_path  -lxxx   -o main

将库添加到系统目录

将库添加到系统目录,可以让其他程序调用。

一.一般系统的库目录如下:

可以将自己的库放在系统默认的库的路径下----需要sudo权限
sudo cp libxxx.so /lib
sudo cp libxxx.so /usr/lib

二.也可以将自己的库放在自己指定的目录下,然后在环境变量中添加该目录。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/lib
//如果相对当前用户生效 就把该语句放在 ~/.bashrc  文件中
//如果相对所有用户生效 就把该语句放在 /etc/profile 文件中

这样就可以在任何目录下调用自己的库了。

三.通过修改系统配置文件来设置----需要sudo权限

sudo vim  /etc/ld.so.conf.d/libc.conf
将自己的库的路径追加到该文件最后
:wq 保存退出   使用  sudo  ldconfig 来重新加载配置
相关文章
|
存储 IDE 算法
剑池 CDK 工具及端云—体介绍(一)| 学习笔记
快速学习剑池 CDK 工具及端云—体介绍。
剑池 CDK 工具及端云—体介绍(一)| 学习笔记
|
消息中间件 存储 缓存
Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍(1)
Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
4026 0
|
7月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
842 8
|
存储 算法 安全
硬盘数据恢复工具,测评八款软件 帮你恢复删除的文件
在日常使用电脑的时候,很多用户都有过误删除重要文件、硬盘无法访问或是格式化后丢失重要数据的经历。幸运的是,这些重要的数据并非在删除或硬盘格式化后就完全消失不见了,我们借助硬盘数据恢复工具仍然有很大几率恢复丢失的数据。今天会和大家讨论一下硬盘数据恢复工具的工作原理和局限性,并且测评几款常用的工具软件,希望可以帮助大家在丢失数据的时候可以快速找得解决方案。
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
478 0
|
存储 SQL 缓存
MySQL中间件ProxySQL介绍
ProxySQL 是一个高性能的SQL 代理。ProxySQL有一个高级多核体系结构。支持数十万并发连接,可以多路复用到后端服务器上。 作为守护进程运行。而且有一个进程监视这个守护进程,并在守护进程崩溃时重启守护进程,以减少停机时间。这个守护进程接受来自MySQL客户端的请求,并将其转发到后端的MySQL服务器上。 ProxySQL被设计为可以连续运行而且不需要重启。大多数配置可以在运行时使用类似SQL语句的查询完成。
2608 107
MySQL中间件ProxySQL介绍
|
消息中间件 安全 Java
如何为Kafka加上账号密码(一)
一直以来,我们公司内网的Kafka集群都是在裸奔,只要知道端口号,任何人都能连上集群操作一番。直到有个主题莫名消失,才引起我们的警觉,是时候该考虑为它添加一套认证策略了。
3589 2
|
算法 Unix Java
Zlib和Zstd 性能对比评测
Zlib和Zstd 性能对比评测
2602 0