c静态库linux

时间:2012-08-03 04:58:35

标签: c linux static-libraries

我想创建一个静态库,并且能够通过遵循yolinux教程正确地创建一个 http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

当我想要包含一个静态库来创建一个新的静态库时,会出现问题。     场景是:

gcc -Wall -c cdbSearch.c
ar -cvq cdbSrc.a cdbSearch.o cdb.a

这成功创建了一个名为cdbSrc.a的静态库

但是当我尝试将其与我的测试程序链接时

gcc -o cdbtest cdbtest.c cdbSrc.a
cdbSrc.a(cdbSearch.o): In function `cdb_search':
cdbSearch.c:(.text+0xa2): undefined reference to `cdb_seek'
collect2: ld returned 1 exit status

它给我一个错误,说cdb_seek不能被引用,这实际上是cdb.a的一部分

如果我使用cdb.a编译测试程序它可以正常工作,但它不能达到目的..

gcc -o cdbtest cdbtest.c cdbSrc.a cdb.a

并且二进制文件已成功创建cdbtest。

这是预期的行为,是为什么?如果不是我做错了什么..

3 个答案:

答案 0 :(得分:3)

是。这是预期的行为。您需要链接所有静态库以形成二进制文件。与共享库不同的静态库不会保存到其他库的链接。

答案 1 :(得分:1)

静态库只是目标文件的存档。您必须使用ar x

解压缩cdb.a.

然后,将所有解压缩的对象和cdbSearch.o打包到cdbSrc.a中

答案 2 :(得分:1)

您想要创建一个新的静态库,该库应包含cdbSearch.o以及cdb.a右侧的所有目标文件。

我假设cdb.a有两个目标文件,first.osecond.o

ar允许将对象文件添加到现有静态库。您可以执行以下命令。

ar r cdb.a cdbSearch.o

如果名为cdb.a的库出现,则上述命令会将新的目标文件cdbSearch.o添加到其中。否则它将创建新的静态库cdb.a,它只包含一个目标文件(cdbSearch.o)。

现在cdb.a将包含3个对象文件(first.osecond.ocdbSearch.o)。现在,您可以根据需要重命名静态库文件名mv cdb.a cdbSrc.a

我们也可以使用d选项从静态库中删除任何现有的目标文件。例如,如果要从second.o删除目标文件cdbSrc.a,则可以执行以下命令。

ar d cdbSrc.a second.o

使用t选项列出静态库的目标文件。

ar t cdbSrc.a