假设您编写了一些C函数,并且希望将它们打包以供其他程序以后使用..什么是最好的方法? 当然要创建一个库! C语言中的库是函数和声明的集合,这些函数和声明可供其他程序使用。 有两种不同的库,静态库和动态库。 让我们看一下静态库。
让我们从一些完成各种任务的C函数开始。
您要做的第一件事是使用gcc编译这些C文件,命令“ gcc -c * .c”将汇编源文件,但不链接它们。 该命令的输出以每个C文件的目标文件的形式出现。 默认情况下,目标文件名将是源文件名,后缀为“ .o”而不是“ .c”。
我们需要用来创建静态库的下一个命令是“ ar”命令。 “ ar”可以创建,修改或提取档案。 我们应该添加“ -rc”选项,r代表“将文件成员 …插入到存档中 ( 替换 )”。 如果先前存在的成员的名称与要添加的成员的名称相匹配,则将其删除。”,c表示“ 创建档案。 当您请求更新时,总是创建指定的归档 (如果不存在)。 但是会发出警告,除非您事先使用此修饰符指定要创建它。”
如下所示,在编写了“ ar -rc lib_my_functions.a * .o”之后,系统创建了一个名为lib_my_functions.a的库文件,其中包含文件夹中所有以“ .o”结尾的文件。
我们可以使用“ ar -t ”命令确认库中的内容,如下所示,所有“ .o ”文件都包含在lib_my_functions.a库文件中。
之后,我们应该运行“ ranlib lib_my_functions.a ”命令,该命令“生成对档案内容的索引,并将其存储在档案中。”具有这种索引的库可加快链接到库的速度,并
允许库中的例程相互调用而无需考虑
它们在档案中的位置。
而已! 大功告成 我们已经通过自定义函数创建了一个静态库。 但是现在我们如何使用它呢? 假设我们有一个小函数可以使用_puts函数打印一条语句。
如果我们使用gcc尝试进行编译,则会收到错误消息。
这是因为我们从未包含在gcc命令中创建的静态库。 正确的方法是:
“ -L。 ”选项在当前目录中查找库文件,并且在链接过程中,附加到库名称的“ -l ”(减去“ lib ”)包括_my_functions库。 因此,现在main.c中的函数_puts可以链接到lib_my_functions.a库中的函数定义。
所以现在当我们运行输出文件“ main”时,我们得到了!