C语言链接库的用法简记
库文件简单了说就是包含了别人(或者自己)已经写好的代码,可以直接调用的其内部函数的文件。库文件又包含动态库文件和静态库文件。那不妨看看C语言链接库的用法简记吧。以下仅供参考!
静态库
Linux系统下后缀名为*.a
Windows系统下后缀名为*
调用静态库,在编译器进行编译过程中,在有需要调用到库文件内部函数的地方,编译器会将静态库里的函数实现过程,拷贝到函数调用的地方。在编译好的程序运行时,不需要依赖库文件,可以独立运行。库文件对代码复用性很高,容易理解也容易使用,对提高开发速率有很大帮助,不需要自己造轮子。
Linux下生成静态库文件命令
$ gcc -c [FileName].c // 生成*.o文件
$ ar -crv [FileName].a [FileName].o // 生成*.a文件
动态库
Linux系统下文件名格式为lib*.so
Windows系统下后缀名*.dll
上面介绍了静态库在编译过程中,编译器会将函数实现拷贝到可执行文件中,所以在程序运行时会占用一定的资源,造成资源浪费,而且在库文件的版本更新中,一点微小的改动,就需要对整个程序进行重新编译发布,在使用者使用过程中,这是得不偿失的。而动态库,则改进了静态库的这些缺点。简单介绍两个方面:
1、静态库在编译过程中不需要将代码编译到可执行程序中,在程序运行时需要调用的时候才加载。解决了在开发程序中使用静态库版本更新的问题,使用动态库不需要将自己编写的程序重新编译,更新库和更新程序是独立的两项任务。
2、可以实现库共享,不同程序的相同功能代码的实现可以只需要一份库文件提供调用,比如jpeg图像编码功能,很多程序都需要进行图像处理,简单的Logo头像的显示到复杂的平面设计,不同的软件可能使用的都是同一份库文件。
虽然动态库相对静态库优化了很多缺点,但并不是说可以完全不需要静态库。在内部开发的时候,两个同事对同一个项目的'不同子功能进行开发,这些功能具有相互联系,但是又不希望对外部人员提供引用,在程序发布时,打包编译所有的代码实现都编译到程序中。
Linux下编译生成动态库文件
$ gcc -fPIC -c [FileName].c
$ gcc -shared -o lib[FileName] [FileName].o
也可以一条命令编译
gcc -fPIC -shared [FileName].c -o lib[Name]
0x02 库的编程使用
我主要使用简单的编程实例介绍动态库的使用,静态库的使用方法与之相同。
我所举的例子中编写了3份文件
1、libtest.c // 库函数实现,最终将此文件编译成库文件
2、test.h // 测试头文件,文件内只有一个结构体变量
3、main.c // 测试代码主函数的实现
ps: test.h头文件中只提供了一个结构体,库文件并不提供新的变量类型引用,新的变量一定需要定义
直接呈上代码
test.h:
/** test.h **/
#ifndef TEST_H
#define TEST_H
typedef struct {
int a;
char b;
}Test_t;
#endif
libtest.c:
/** libtest.c **/
#include
#include
#include "./test.h"
int fun1(int a)
{
return a*2;
}
Test_t *fun2(Test_t a)
{
a.a++;
a.b = 's';
Test_t *b = malloc(sizeof(Test_t));
*b = a;
return b;
}
很简单的内容,两个函数,fun1()和fun2()
先编译库文件
$ gcc -fpic -shared libtest.c -o
main.c:
/** main.c **/
#include
#include
#include "./test.h"
int main()
{
//struct TEST_T A;
Test_t A;
A.a = 10;
A.b = 'w';
printf("[init] Test.a = %d ", A.a);
printf("[init] Test.b = %c", A.b);
printf("");
printf("[call] fun1() = %d", fun1(A.a));
printf("");
Test_t *B;
B = (Test_t *)fun2(A); // 加强制转换
printf("[call] fun2().a = %d", B->a);
printf("[call] fun2().b = %c", B->b);
printf("");
free(B);
}
编译主程序
$ gcc main.c -L./ -ltest -I./ -o main
0x03 测试&结果
wangsansan@ubuntu$ ./main
[init] Test.a = 10 [init] Test.b = w
[call] fun_test() = 20
[call] fun2_test().a = 11
[call] fun2_test().b = s
wangsansan@ubunut$
-
C语言的移位操作符使用方法
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。位移位运算符分为左移和右移两种,均为双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。以下是小编为大家搜索整理的C语言的移位操作符使用方法,希望能给大家带来帮...
-
C语言考试机试经验三部曲
全国计算机等级考试的持续升温,至使全国计算机等级考试证书已成为国家公务员、国家企事业单位工作人员、公司员工等上岗、加薪、提拔的必备条件。以下是本站小编整理的C语言考试机试经验三部曲,希望可以为您的考试带来帮助!第一部:备考篇名将不打无准备之仗,复习备...
-
二级C语言考试复习五要点
综观近几年全国计算机等级二级基础部分和C语言程序设计的题目,笔试中大多数考题是与大纲要求的基本内容一致的,难度不高,但内容十分广泛,应牢固掌握。以下是小编为您带来的二级C语言考试复习五要点,感谢您的阅读!一、了解试卷,胸中有数综观近几年全国计算机等级二级...
-
关于C语言精选模拟练习题
C语言是一个有结构化程序设计、具有变量作用域(variablescope)以及递归功能的过程式语言。下面是小编为大家整理的关于C语言精选模拟练习题,欢迎参考~5:请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用c语言提供的`求字符串长度的函数),函数返回较长...