我想创建一个静态库,并且能够通过遵循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。
这是预期的行为,是为什么?如果不是我做错了什么..
答案 0 :(得分:3)
是。这是预期的行为。您需要链接所有静态库以形成二进制文件。与共享库不同的静态库不会保存到其他库的链接。
答案 1 :(得分:1)
静态库只是目标文件的存档。您必须使用ar x
然后,将所有解压缩的对象和cdbSearch.o打包到cdbSrc.a中
答案 2 :(得分:1)
您想要创建一个新的静态库,该库应包含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
选项从静态库中删除任何现有的目标文件。例如,如果要从second.o
删除目标文件cdbSrc.a
,则可以执行以下命令。
ar d cdbSrc.a second.o
使用t
选项列出静态库的目标文件。
ar t cdbSrc.a