2012-08-03 62 views
0

我想要一个静态库,并能够做出一个正确遵循的yolinux教程 http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.htmlç静态库的Linux

时,我想包括静态库,使一个新的静态库的问题就出现了。 方案是:

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编译测试程序,它工作正常,但它没有t服务的目的..

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

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

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

+1

的可能重复[集合静态库(http://stackoverflow.com/questions/9547061/aggregate-static-libraries) – Mat 2012-08-03 05:08:31

回答

3

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

1

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

在这之后解压cdb.a,包解压后的所有对象加cdbSearch.o到cdbSrc.a

+0

看起来有趣的选项将尝试了这一点.... – 2012-08-03 05:19:41

+1

你可以这只是为了欺骗目的。但是,最好在独立的库中保留不相关的功能,因为它有助于更​​好的维护。 – Jay 2012-08-03 05:31:30

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.o,second.ocdbSearch.o)。现在,您可以根据需要重命名静态库文件名,mv cdb.a cdbSrc.a

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

ar d cdbSrc.a second.o

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

ar t cdbSrc.a