大话C语言:第26篇 静态库
1 静态库概述
C语言静态库(Static Library)是一种包含一组目标文件的归档文件,这些目标文件通常是由多个C语言源文件编译而成的。静态库在程序编译时被链接到目标程序中,成为程序的一部分,因此在运行时不再需要额外的库文件。与动态库(Dynamic Library)不同,静态库在编译时就已经被完全嵌入到可执行文件中,因此生成的可执行文件通常较大,但无需在运行时依赖外部库文件。
静态库通常具有.a
的文件扩展名(代表archive),而在Windows中则通常使用.lib
扩展名。创建静态库的过程涉及将多个目标文件(通常由.o
或.obj
文件组成)打包成一个单独的库文件。
使用静态库的好处之一是,它使得程序在分发时更加简单,因为所有必要的代码都已经包含在可执行文件中。此外,由于静态链接在编译时就已经完成,因此可以避免运行时动态链接可能带来的版本兼容性问题。然而,静态库也有一些缺点,比如生成的可执行文件较大,以及如果多个程序使用相同的静态库,那么每个程序都会包含库的一份完整副本,导致磁盘空间的浪费。
2 静态库制作
例如,实现一个简单的数学运算MathFun.c
// 静态库中的函数,用于加法
int add(int a, int b)
{
return a + b;
}
// 静态库中的函数,用于减法
int subtract(int a, int b)
{
return a - b;
}
-
通过gcc -c编译源代码,生成目标文件.o
-
通过ar rc(或rcs)将目标文件.o打包生成静态库.a文件
gcc -c MathFun.c -o MathFun.o
ar rc libMathFun.a MathFun.o
注意,库文件需要以lib开头,例如上述数学库,libMathFun.a;如果不带lib的话,将库文件链接至可执行文件时,可能会引起编译错误,如下:
# mathfunc.a放在dynamicdemo/lib目录下
whccf@whccf-VirtualBox:~/code/staticdemo$ gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib -lmathfunc
/usr/bin/ld: 找不到 -lmathfunc
collect2: error: ld returned 1 exit status
# 解决方案
# 将dynamicdemo/lib下的mathfunc.a重新命名为libmathfunc.a,然后,再次使用gcc命令重新编译即可。
3 静态库使用
主程序calculator.c
,它使用静态库中的函数
#include <stdio.h>
#include "MathFun.h"
int main()
{
int a = 5;
int b = 3;
int sum = add(a, b);
int diff = subtract(a, b);
printf("Sum: %d\n", sum);
printf("Difference: %d\n", diff);
return 0;
}
为了编译这个程序并链接静态库,需要使用以下命令:
gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib/ -lMathFun
其中,
-
-L.
告诉编译器在当前目录下查找库文件 -
-lMathFun
则告诉编译器链接名为libMathFun.a
的库,注意不需要提供.a
后缀
原文地址:https://blog.csdn.net/whccf/article/details/140109853
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!