繁体   English   中英

C静态库Linux

[英]c static library linux

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

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

是。 这是预期的行为。 您需要链接所有静态库以形成二进制文件。 与共享库不同,静态库将不包含指向其他库的链接。

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

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

你想创建一个新的静态库,它应该包含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选项从静态库中删除任何现有的目标文件。 例如,如果要从cdbSrc.a删除目标文件second.o ,可以执行以下命令。

ar d cdbSrc.a second.o

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

ar t cdbSrc.a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM