0

我想制作一个静态库,并且能够按照 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。

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

4

3 回答 3

3

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

于 2012-08-03T05:10:52.530 回答
1

静态库只是目标文件的存档。您必须使用解压缩 cdb.aar x

之后,将所有解压缩的对象加上 cdbSearch.o 打包到 cdbSrc.a

于 2012-08-03T05:11:41.830 回答
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.ocdbSrc.a可以执行以下命令。

ar d cdbSrc.a second.o

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

ar t cdbSrc.a

于 2012-08-03T09:42:15.337 回答