关于C静态库的有趣部分

静态似乎是另一个重复性的任务,因为您必须将每个程序添加到库中,将这些程序称为书籍,您每次进行更改时都会在其中组织一次。 假设我们只用一页,一个字,一个字母……。 但这是相反的。 在本文中,我们将探索该库的用法,以便节省我们可以用来更快地完成项目的时间,工作和精力。

首先,让我们一起检查以下主题:

  • 为什么要使用库
  • 他们如何工作
  • 如何建立它们
  • 如何使用

那么,如果您只能在程序中编写代码,为什么还要使用库呢? 让我们以书籍为例,回想一下:您是一名作家,每天早晨醒来,花时间写一本书,想与他人分享。 然后,完成后,将该脚本发送给编辑器以出售该书。

好消息!

您的书已被批准出售,仅是最后一个细节……。 打印机无法正常工作,因此您必须一次又一次地写1000本书才能出售。

在我们的例子中,将相同的函数编码1000次,您可以问,谁在正确的头脑中会这样做? 好吧,发生了,因为我们开始编写代码,而我们对此世界的了解并不多,所以我们开始在每个程序上复制并粘贴所需的功能。 认为这将是解决我们项目的最简单方法,但让我们购买打印机吧! 或者让我们对其进行编码。 由于这些库使我们能够使用以前编写的相同函数,而无需再次编写。 写一次,用很多。

  / static_libraries $ ar -t liball.a 
0-uper.o
100at.o
1类
2个
3-myputs.o
4-brk.o
5口
6个

编码库将不同的功能组合到一个文件中(对于Linux,“。a”和对于Windows,“。lib”),因此您可以像在C语言中的其他任何函数一样调用它们。就像您的个人书籍(代码)一样。

让我们开始!

  / static_libraries $ touch file.c 
/ static_libraries $ touch file2.c
/ static_libraries $ touch 0-upper.c
  ... 
/ static_libraries $ cat 0-upper.c
/ **
* _isupper-检查字母是否为大写
* @ c:要检查的字母
*
*返回:1个真实的0 fales
* /
  int _isupper(int c) 
{
如果(c> ='a'&& c <='z')
{
返回(0);
}
否则(c> ='A'&& c <='Z')
{
返回(1);
}
返回(0);
}

首先,创建包含所有将要使用的功能的C源文件。 您的库可以包含许多目标文件。

  gcc -c 0-upper.c 

创建C源文件后,将文件编译为目标文件。

— — —

为了创建一个库,我们使用一个名为“ ar”的程序来表示“ archiver”。 此程序可用于创建静态库,修改静态库中的目标文件,列出库中目标文件的名称,等等:

  / static_libraries $ ar -rc liball.a objfile1.o objfile2.o 0-upper.o 

这将创建一个名为liball.a的静态库,其中存储了目标文件。如果'c'标志尚不存在,它会告诉ar创建该库。 'r'标志告诉它用新的目标文件替换库中较旧的目标文件。 记住使用“ ar -t”来查看库中的文件。 保留“ lib”部分,并根据需要更改其他字母。

  / static_libraries $ gcc -c print-alphabet.c 
/ static_libraries $ ar -rc libalpha.a print_alphabet.o
ar -rc libalpha.a print_alphabet.o
/ static_libraries $ ar -t libalpha.a
print_alphabet.o
ar -t libalpha.a
print_alphabet.o

/ static_libraries $ ranlib libalpha.a
/ static_libraries $ cat main.c
void print_alphabet(void);

int main(void)
{
print_alphabet();
return (0);
}
cat main.c
void print_alphabet(void);

int main(void)
{
print_alphabet();
return (0);
}

/ static_libraries $ gcc main.c -L. -llibalpha.a -o alpha
gcc main.c -L. -llibalpha.a -o alpha
/ static_libraries $ ./alpha
abcdefghijklmnopqrstuvwxyzubuntu
./alpha
abcdefghijklmnopqrstuvwxyzubuntu

为了在程序上使用静态库,我们必须使用库编译实际程序,“ ranlib”在库中添加或更新目标文件。 将程序链接到库时,请确保指定可以在何处找到该库。 “ -L”部分告诉gcc除了查找libalpha.a的其他库目录外,还要查找当前目录。

参考书目

Keren,Guy。 构建和使用静态和共享的“ C”库 ,1998年,docencia.ac.upc.edu / FIB / USO / Bibliografia / unix-c-libraries.html#what_is_a_library。