一.库函数介绍:
c语言包含用于执行标准任务的函数,这些任务可以预编译并放置在特殊的目标代码文件(称为库)中。
库文件中的函数可以通过链接器链接到APP应用程序,从而无需在每次运行程序时编译这些公共函数。
标准的c函数库名称为libc,包含内存管理和输入输出操作等基本函数。 这些库位于系统的公共目录中,如/usr/lib,系统中的所有用户都可以使用这些库函数,也可以自己创建库。
来修改标记元素的显示属性。 静态库; 共享库
二.静态库:
1 )基本概念:
静态库也称为文档文件(Archive File )。 这是多个. o文件的集合。 Linux静态库文件的后缀为“a”。
静态库中的代码在编译时链接到APP应用程序
静态库中的每个成员. o文件没有特殊的存在格式,而只是. o文件的集合。
使用“ar”工具维护和管理静态库
2 )静态库的创建和使用方法
以下是创建静态链接库的示例。
1 .创建源文件:
源代码1:my_strcpy.c:(1 (实现一个strcpy功能) ) ) )。
#包含
#包含
#包含
voidmy_strcpy(char*des,const char *src ) ) )。
{
wile(*des=*src );
}
源代码2:my_strcmp.c(1 (实现一个strcmp的功能) ) ) ) ) ) ) )。
#包含
#包含
#包含
intmy_strcmp(constchar*obj1,const char *obj2) ) ) ) ) ) ) )。
{
while(*obj1*obj2) )。
{
if(*obj1-*obj2) ) ) ) ) ) ) if ) ) ) ) ) )。
{
return(*obj1-*obj2);
}
else
{
obj1;
obj2;
}
}
返回0;
}
2、生成. o文件
gcc -c my_strcpy.c my_strcmp.c
3、建立静态链接库
ar rcs libmylib.a *.o
现在,已在当前路径下创建了libmylib.a静态库。
在ar的三个参数中,r表示向归档文件插入,c表示创建归档文件,s表示如果归档文件包含对象模式,使用该参数创建保存文件的符号表
lib和. a都是系统指定的静态库文件的固定形式,mylib才是静态库的名称,编译时链接器使用标准路径(/usr/lib; /lib )或按用户指定的路径查找. a文件。
4、测试静态链接库
编写测试代码: main.c
#包含
#包含
int main () )
{
int res;
char des[100]={0};
const char *s1='hello linux.';
const char *s2='hello world.'
my_strcpy(des,s1 );
printf(%s(n ),des );
Bero(des,0 );
my_strcpy(des,s2 );
printf(%s(n ),des );
res=my_strcmp(S1,s2 );
是if(RES0)
printf(S1S2(n ) );
ELSEif(RES0)
printf(S1S2(n ) );
else
printf(S1=S2(n );
返回0;
}
gcc-omain main.c-static-l .lmy lib
-static指定编译器链接静态库,-L .指定静态库的路径作为当前路径。 在浏览gcc编译器可搜索的目录和库文件时,必须使用-L库名称。 例如,可以通过添加-lm将标准算术库链接到程序汇,通过添加-lpthread将标准线程库链接到linux标准线程库
./main后的输出:
你好,Linux。
光晕世界。
s1 s2
3 )总结:
静态库允许程序独立于其他库运行,但它占用大量内存和磁盘空间,并且在库文件更新时需要重新编译源代码,因此缺乏灵活性。
使用lsl main,您可以看到可执行文件main的大小至少为500kb。 这是因为在编译时指定了-static。 由此可知,编译时需要链接的所有库都作为静态库被链接,gcc默认链接到标准c库,因此标准c库的静态库版本也被链接到可执行程序
实际上,在编译时不需要添加-static,而是直接使用gcc-omain main.c-l .lmy lib将连接器链接到指定的静态库和标准c的共享库。 这样编译后,可执行程序只有7KB左右的大小。