静态库似乎是另一个重复性的任务,因为您必须将每个程序添加到库中,将这些程序称为书籍,您每次进行更改时都会在其中组织一次。 假设我们只用一页,一个字,一个字母……。 但这是相反的。 在本文中,我们将探索该库的用法,以便节省我们可以用来更快地完成项目的时间,工作和精力。
首先,让我们一起检查以下主题:
- 为什么要使用库
- 他们如何工作
- 如何建立它们
- 如何使用
那么,如果您只能在程序中编写代码,为什么还要使用库呢? 让我们以书籍为例,回想一下:您是一名作家,每天早晨醒来,花时间写一本书,想与他人分享。 然后,完成后,将该脚本发送给编辑器以出售该书。
好消息!
您的书已被批准出售,仅是最后一个细节……。 打印机无法正常工作,因此您必须一次又一次地写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.oar -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。