Linux系统中的静态库和动态库
目录
Linux系统中的静态库和动态库
一、静态库
1、静态库的制作
①、源程序编写
②、编译源码
③、创建静态库
2、使用静态库
①、编写主程序
②、编译主程序并链接静态库
③、执行
④、结果
二、动态库
1、动态库的制作
①、源程序编写
②、编译源代码为位置无关代码(PIC)
③、创建动态库
2、使用动态库
①、编写主程序
②、编译主程序并链接动态库
③、运行程序
三、静态库和动态库的区别
1、加载时机
2、可执行文件大小
3、更新和维护
Linux系统中的静态库和动态库
一、静态库
1、静态库的制作
①、源程序编写
add.c
int add(int a, int b)
{return a + b;
}
sub.c
int sub(int a, int b)
{return a - b;
}
②、编译源码
使用 gcc
编译器将源代码编译成对象文件(.o
文件)
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
③、创建静态库
使用 ar
工具将对象文件打包成一个静态库。
ar -rcs libmylib.a add.o sub.o
ar 参数:
c 禁止在创建库时产生的正常消息
r 如果指定的文件已经存在于库中,则替换它
s 无论 ar 命令是否修改了库内容都强制重新生成库符号表
v 将建立新库的详细的逐个文件的描述写至标准输出
q 将指定的文件添加到库的末尾
t 将库的目录写至标准输出
2、使用静态库
①、编写主程序
#include <stdio.h>
extern int add(int a, int b);
extern int sub(int a, int b);
int main(int argc, const char *argv[])
{int a = 5;int b = 3;printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", sub(a, b));
return 0;
}
②、编译主程序并链接静态库
gcc main.c -L. -lmylib -o main
-
-L.
表示指定当前目录作为库文件的搜索路径。 -
-lmylib
表示链接名为libmylib.a
的静态库(注意-l
后面的库名不带lib
前缀和.a
后缀)。 -
-o main
指定输出的可执行文件名为 main。
③、执行
./main
④、结果
二、动态库
1、动态库的制作
①、源程序编写
add.c
int add(int a, int b)
{return a + b;
}
sub.c
int sub(int a, int b)
{return a - b;
}
②、编译源代码为位置无关代码(PIC)
gcc -fPIC -c add.c -o add.o
gcc -fPIC -c sub.c -o sub.o
-fPIC
选项表示生成位置无关代码,这是动态库的要求之一。
③、创建动态库
gcc -shared -o libmylib.so add.o sub.o
-
-shared
表示生成共享库(动态库)。 -
-o libmylib.so
指定输出的动态库文件名为libmylib.so
,动态库通常以.so
结尾。
2、使用动态库
①、编写主程序
#include <stdio.h>
extern int add(int a, int b);
extern int sub(int a, int b);
int main(int argc, const char *argv[])
{int a = 5;int b = 3;printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", sub(a, b));
return 0;
}
②、编译主程序并链接动态库
gcc main.c -L. -lmylib -o main
和静态库链接时的命令类似,但这里链接的是动态库。
③、运行程序
-
在运行程序之前,需要确保动态库能够被找到。可以将动态库所在的目录添加到
LD_LIBRARY_PATH
环境变量中,或者将动态库拷贝到标准的库目录(如/usr/lib
),或者添加/etc/ld.so.conf.d/*.conf文件,执行ldconfig刷新 -
设置
LD_LIBRARY_PATH
的命令如下:export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
三、静态库和动态库的区别
1、加载时机
-
静态库是在程序编译链接阶段被加载到可执行文件中,生成的可执行文件包含了静态库的代码。
-
而动态库是在程序运行时加载的,可执行文件中不包含动态库的代码,只是在运行时通过动态链接器从动态库中获取所需的代码。
2、可执行文件大小
-
使用静态库时,可执行文件会比较大,因为它包含了静态库的代码。
-
使用动态库时,可执行文件相对较小,因为动态库的代码是共享的,多个程序可以同时使用同一个动态库。
3、更新和维护
-
如果更新了静态库,需要重新编译链接使用该静态库的程序。
-
而动态库更新后,只要不破坏原有接口,使用该动态库的程序不需要重新编译链接,只要重新启动即可使用新的动态库版本。
参考资源:https://download.csdn.net/download/2403_82436914/90713276