C-数据结构-静态库

‘’’
库是二进制文件
cd usr/include/ (库的头文件所在位置)
export (显示环境变量)
man string.h
动态库(共享库)


静态库 libxx.a     xx指代库名
ar -cr libxx.a yyy.o    创建一个静态库(.o是依赖文件)
发布到
/usr/local/include
/usr/local/lib

gcc -L/usr/local/lib -o main mian.o -lxx
-l 参数必须放在最后,有依赖

ldd ./llist  输出所用到的动态库

‘’’

/*
针对这的四个文件llist.h,llist.c,main.c,Makefile, 如何生成使用静态库
先 make 生成对应的 llist ,llist.o,main.o , llist.h,llist.c,main.c,Makefile,
make clean 清楚 后缀 .o文件 llist.h,llist.c,main.c,Makefile

gcc -c llist.c   生成llist.o
ar -cr libllist.a llist.o   生成libllist.a
cp llist.h /usr/local/include/
cp libllist.a /usr/local/lib/
gcc -o main mian.c -lllist  生成可执行的 main
./main
ldd ./main

*/

补充说明

创建和发布静态库是C语言开发中的一个常见操作。下面是详细的步骤和一些注意事项。

创建静态库

假设你有一个源文件 yyy.c,你首先需要将其编译为目标文件 .o

gcc -c yyy.c -o yyy.o

然后,你可以使用 ar 工具创建一个静态库 libxx.a

ar -cr libxx.a yyy.o

在这条命令中:

  • ar 是创建和操作静态库的工具。
  • -c 选项表示创建一个新的库。
  • -r 选项表示插入或替换库中的文件。
  • libxx.a 是静态库的名称。
  • yyy.o 是你要添加到库中的目标文件。

发布静态库

为了使你的静态库和头文件可用于其他项目,你通常会将它们发布到系统的标准位置。例如:

  • 将头文件发布到 /usr/local/include
sudo cp xx.h /usr/local/include/
  • 将静态库发布到 /usr/local/lib
sudo cp libxx.a /usr/local/lib/

使用静态库

在你需要使用静态库的项目中,编译时需要指定库的路径和库的名称。假设你的源文件是 main.c,你可以按如下方式进行编译:

gcc -o main main.o -L/usr/local/lib -lxx

在这条命令中:

  • -L/usr/local/lib 选项告诉编译器去 /usr/local/lib 目录寻找库文件。
  • -lxx 选项告诉编译器链接 libxx.a 静态库。注意,-l 后面跟的是库名(去掉前缀 lib 和后缀 .a)。
  • main.o 是你要编译的目标文件。

注意:-L-l 选项必须放在其他选项的后面,以确保编译器能够正确解析依赖关系。

总结

通过这些步骤,你可以创建一个静态库并将其发布到系统的标准位置,从而在其他项目中使用它。确保头文件和库文件都在适当的位置,这样编译器和链接器就能找到它们。

区别静态库和动态库

在C语言编程中,库是一组预编译的函数,用于帮助开发者重用代码并简化复杂程序的构建。库主要有两种类型:静态库和动态库。它们在构建、链接、分发和运行时行为上有显著区别。

静态库

1. 定义:

  • 静态库是在编译时被直接嵌入到可执行文件中的库。
  • 常见的文件扩展名为 .a(在Unix/Linux系统上)或 .lib(在Windows系统上)。

2. 特点:

  • 编译时链接:静态库在编译时与应用程序链接,这意味着所有需要的库代码被复制到最终的可执行文件中。
  • 独立性:生成的可执行文件在运行时不再依赖静态库文件,可以在没有库文件的系统上运行。
  • 大小较大:因为每个可执行文件都包含了所需的库代码,可能导致文件较大。
  • 更新复杂:如果静态库中的代码有更新,需要重新编译应用程序以包含新的库代码。

3. 创建和使用:

  • 使用 ar 工具创建静态库(例如,ar rcs libmylib.a myfile1.o myfile2.o)。
  • 在编译时链接静态库(例如,gcc -o myapp myapp.c -L. -lmylib)。

动态库

1. 定义:

  • 动态库是在运行时被加载和链接的库。
  • 常见的文件扩展名为 .so(在Unix/Linux系统上)或 .dll(在Windows系统上)。

2. 特点:

  • 运行时链接:动态库在程序运行时加载,这意味着库代码不被复制到可执行文件中,而是在运行时被系统加载。
  • 共享性:多个应用程序可以共享同一个动态库,减少内存使用和磁盘空间占用。
  • 较小的可执行文件:因为可执行文件中不包含库代码,所以文件较小。
  • 便于更新:动态库更新后,无需重新编译依赖它的应用程序,只需确保新的动态库与旧版保持二进制兼容。

3. 创建和使用:

  • 使用编译器选项创建动态库(例如,gcc -shared -o libmylib.so myfile1.o myfile2.o)。
  • 在编译时链接动态库(例如,gcc -o myapp myapp.c -L. -lmylib)。
  • 运行时需要动态库文件存在于系统的库路径中(如通过 LD_LIBRARY_PATH 环境变量设置)。

静态库与动态库的比较

  • 大小和独立性:静态库生成的可执行文件较大,但独立性强;动态库生成的可执行文件较小,但依赖于外部库文件。
  • 内存和资源使用:静态库可能导致内存和磁盘空间浪费,因为每个应用程序都包含库代码副本;动态库可以被多个应用程序共享,节省资源。
  • 更新和维护:静态库更新需要重新编译所有依赖的应用程序;动态库更新只需替换库文件,不影响应用程序。

这些差异使得开发者在选择使用静态库或动态库时需要权衡应用程序的需求和分发策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值