Linux下C语言开发-静态库及动态库
Linux作为一个开源的操作系统,拥有非常多的开发者及开源资源,为了方便我们的程序供他人直接调用,我们可以采用库函数的方式。
库函数
一般来说库函数分为两种方式:静态库和动态库。两者的区别其实很小,静态库是必须要链接到执行文件中去的,而动态库是不需要链接到最后的执行文件中的。
也就是说,对于最后的执行文件而言,你是否删除静态库无所谓。但是,一旦你删除了动态库,最后的执行文件就无法执行了。
静态库
在linux下一般使用ar命令生成静态库,下面举个例子,实现一个名为test的静态库:
1、静态库实现
.c文件为:
1 2 3 4 5 6 | #include "test.h" int add(int a, int b) { return a + b; } |
.h文件为
1 2 3 4 5 | #ifndef _TEST_H #define _TEST_H int add(int a, int b); #endif |
2、静态库编译
(1)首先生成*.o文件,输入
1 | gcc -c test.c -o test.o |
(2)利用ar命令生成静态库,输入
1 | ar rc libtest.a test.o |
3、静态库使用
我们使用该静态库:
1 2 3 4 5 6 7 8 | #include <stdio.h> #include "test.h" int main() { printf("%d\n", add(2, 3)); return 1; } |
输入一个简单的命令就可以生成执行文件了,
(1)首先输入gcc hello.c -o hello ./libtest.a
(2)输入./hello
,验证生成的执行文件是否正确
(3)朋友们可以删除libtest.a文件,重新输入./hello
,验证执行文件是否可以正常运行
动态库
动态链接库不是Linux独有的特性,在windows下面也存在这样的特性。一般来说,windows下面的动态连接库是以*.dll作为结尾的,而linux下面的动态连接库是以*.so结尾的。和静态链接库相比,动态连接库可以共享内存资源,这样可以减少内存消耗。另外,动态连接是需要经过操作系统加载器的帮助才能被普通执行文件发现的,所以动态连接库可以减少链接的次数。有了这个特点,我们就不难发现为什么很多软件的补丁其实都是以动态库发布的。
1、动态库实现
.c文件
1 2 3 4 5 6 | #include "test.h" int add(int a, int b) { return a + b; } |
.h文件
1 2 3 4 | #ifndef _TEST_H #define _TEST_H int add(int a, int b); |
2、动态库的编译
此时如果我们想要生成动态库,要做的工作其实非常简单,可以通过以下命令编译:
gcc test.c -shared -fPIC -o libtest.so
回车后输入ls,我们就可以发现当前目录下面出现了libtest.so文件。
3、动态库的使用
1 2 3 4 5 6 7 8 | #include <stdio.h> #include "test.h" int main() { printf("%d\n", add(2, 3)); return 1; } |
输入以下命令可以生成执行文件
(1)输入gcc hello.c -o hello ./libtest.so
。
(2)输入./hello
,此时可以验证一下执行文件运行是否正确。
(3)删除libtest.so,然后输入./hello
。此时大家可以看看系统有没有错误返回?
本文出自 TENNFY博客,转载时请注明出处及相应链接。
本文永久链接: https://www.tennfy.com/4661.html