欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 大话C语言:第26篇 静态库

大话C语言:第26篇 静态库

2024/10/24 7:24:17 来源:https://blog.csdn.net/whccf/article/details/140109853  浏览:    关键词:大话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后缀

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com