[英]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.o
和second.o
。
ar
允许将目标文件添加到现有的静态库中。 您可以为此执行以下命令。
ar r cdb.a cdbSearch.o
如果存在一个名为cdb.a
的库,则上述命令将在其中添加新的目标文件cdbSearch.o
。 否则,它将创建新的静态库cdb.a
,该库仅包含一个目标文件( cdbSearch.o
)。
现在, cdb.a
将包含3个对象文件( first.o
, second.o
和cdbSearch.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.