静态库与动态库

简介:   函数库分为静态库和动态库两种   静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

 

函数库分为静态库和动态库两种

 

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

 

示例代码:

 

头文件  hello.h  

 

#ifndef _HELLO_H
#define _HELLO_H
void hello(void);
#endif

 

源文件  hello.c

 

void hello(void)
{
    printf("hello world\n");
}


 源文件  main.c

#include stdio.h>

#include "hello.h"

int main()
{
    hello();
    return 0;
}

 

静态库的制作与使用

 

静态库实际上是o目标文件的一个归档,使用ar工具可以创建静态库。

#gcc –c hello.c

#ar cr libhello.a hello.o

 

使用静态库,运行时不依赖静态库

#gcc –o main main.c –L. –lhello  //生成可执行文件main

#./main   //hello world

#rm libhello.a –rf  //移除静态库

#./main   //hello world

 

动态库的制作与使用

   在制作动态库时,要制定-shared,并可通过-fPIC标志生成位置无关代码。

-shared
     Produce a shared object which can then be linked with othe objects to form an executable.  Not all systems support this
option.  For predictable results, you must also specify the same set of options that were used to generate code (`-fpic', `-fPIC', or model suboptions) when you specify this option.

 

# gcc -shared -fPIC -o libmyhello.so hello.o

# gcc -o hello main.c -L. -lmyhello

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

 

因为程序默认在/lib, /usr/lib, LD_LIBRARY_PATH, /etc/ld.so.conf指定的路径查找库,所以可以将libhello.so移动到/lib//usr/lib下,或将当前目录加入到环境变量LD_LIBRARY_PATH,或加到配置文件/etc/ld.so.conf(需要运行ldconfig)。

链接动态库的程序在运行时需要库的存在,因其在运行时动态加载库,从而缩小了可执行文件的体积,节省了磁盘空间,而且动态库可被多个用户程序共享,节省更多的内存空间。

 

 

 


目录
相关文章
|
2月前
|
Linux Windows
静态库和动态库
本文详细介绍了静态库和动态库的概念及使用方法。在 Linux 系统中,静态库以 `libxxx.a` 形式存在,而动态库则为 `libxxx.so`。文章分别讲解了如何创建和使用这两种库,并提供了具体的命令示例。此外,还介绍了将库文件添加到系统目录的方法,包括直接复制到默认库路径、修改环境变量以及编辑系统配置文件等方案。适合初学者了解库文件的基本操作。
|
6月前
|
Linux 编译器 开发者
C/C++动态库与静态库 的详细解析
C/C++动态库与静态库 的详细解析
613 0
|
6月前
|
消息中间件 NoSQL Linux
静态库与动态库
静态库与动态库
静态库与动态库
vs2019使用静态库
vs2019使用静态库
295 0
|
存储 Cloud Native Linux
C++ 动态库与静态库的区别?
C++ 动态库与静态库的区别?
|
存储 Linux 编译器
什么是链接库 | 动态库与静态库
什么是链接库 | 动态库与静态库
155 0
|
Shell 开发工具 iOS开发
动态库下(5)
动态库下(5)
371 0
动态库下(5)
|
Shell 开发工具 C语言
动态库与静态库
本文目标:⭐认识动态静态库,学会结合gcc选项,制作动静态库⭐⭐了解动态库加载过程⭐。
动态库与静态库
|
vr&ar C语言 索引
静态链接和静态库
静态链接和静态库
171 0
vs2019使用动态库
vs2019使用动态库
208 0