无法读取符号:存档没有索引;运行ranlib添加一个
Posted
技术标签:
【中文标题】无法读取符号:存档没有索引;运行ranlib添加一个【英文标题】:could not read symbols: Archive has no index; run ranlib to add one 【发布时间】:2010-05-04 12:33:25 【问题描述】:我尝试用
制作图书馆ar -r -c -s libtestlib.a *.o
如本教程中给出的http://matrixprogramming.com/Tools/CompileLink.html
但是在与库链接时出现以下错误
g++ -o uni2asc uni2asc.o -L../Modules -ltestlib
../Modules/libtestlib.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
我也尝试使用ranlib,但仍然出现错误.. 我正在使用 ubuntu9.10 请为此建议我一些解决方案
【问题讨论】:
请注意,这通常意味着您运行的不是交叉编译器的ranlib 【参考方案1】:您的存档命令看起来不错,您可以尝试以下操作吗? 1) 获取归档/静态库中的目标文件
ar -t libtestlib.a
2) 对于步骤 1 中的每个目标文件(比如 foo.o)
file foo.o
这将告诉您目标文件的格式。如果目标文件是为不同的平台编译的,这将导致无法为存档建立索引。 要更正此问题,您需要重新编译这些文件。 3) 对于步骤 1 中的每个目标文件,执行
nm foo.o
这将列出从文件中导出的符号。
【讨论】:
ar -t libtestlib.a accrpt.o charclass.o ci.o dist.o edorpt.o list.o sort.o stopword.o sync.o text.o unicode.o util.o wacrpt.o word.o 看起来也不错。我建议您重建存档或尝试 ar -s libtestlib.a 仅重建索引。您还可以通过 nm 列出目标文件和库中的符号,例如通过执行 nm libtestlib.a 或 nm accrpt.o。让我们看看这是否有助于调试问题。 nm libtestlib.a nm:accrpt.o:文件格式无法识别 nm:charclass.o:文件格式无法识别 nm:ci.o:文件格式无法识别 nm:dist.o:文件格式无法识别 nm:edorpt.o:文件格式无法识别 nm:list.o:文件格式无法识别 nm:sort.o:文件格式无法识别 nm:stopword.o:文件格式无法识别 nm:sync.o:文件格式无法识别 nm:text.o:无法识别文件格式 nm:unicode.o:无法识别文件格式 nm:util.o:无法识别文件格式 nm:wacrpt.o:无法识别文件格式 nm:word.o:文件格式无法识别 看起来您的目标文件格式不正确。也许它们是为不同的平台编译的?尝试文件 stopword.o 以查看目标文件的格式。无论如何,您将需要重新编译这些,这当然需要拥有源文件。之后创建静态库并将其与您的应用程序链接。 谢谢贾斯米特。有效。正如你所建议的,我重新编译了这些文件并添加到库中。【参考方案2】:我正在使用MinGW编译windows应用程序时遇到错误,所以我找到了内置的MinGW命令:
i686-w64-mingw32-ar
还有
x86_64-w64-mingw32-ar
如果您在 MinGW 中遇到问题,请尝试使用这些而不是 ar
。他们都为我解决了问题。
【讨论】:
谢谢,我没有指定 AR 配置权限,所以这为我解决了问题! 如何在./configure
中指定AR?
你应该能够在你的 shell 命令行中将它指定为环境变量,例如AR=x86_64-w64-mingw32-ar ./configure
.【参考方案3】:
libtool
还有一个有用的选项:
-export-symbols-regexp
.
【讨论】:
【参考方案4】:我在尝试编译 NBIS 库时遇到了完全相同的问题。有一个选项
make install LIBNBIS=yes
创建包含其他存档文件的单个存档。 gcc 链接器不会优雅地处理这个问题,只是发出 Archive has no index 消息。解决方法是将档案保留为单独的文件
make install LIBNBIS=no
然后只需将应用程序链接到所需的存档。存档提要顺序对于确保链接器识别所需的依赖关系很重要,然后在处理 .a 文件时解析它们。
【讨论】:
以上是关于无法读取符号:存档没有索引;运行ranlib添加一个的主要内容,如果未能解决你的问题,请参考以下文章