无法读取符号:存档没有索引;运行ranlib添加一个

时间:2010-05-04 12:33:25

标签: gcc

我尝试用

制作图书馆
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 请为我建议一些解决方案

4 个答案:

答案 0 :(得分:22)

您的存档命令看起来很好,可以尝试以下操作。 1)获取存档/静态库中的目标文件

ar -t libtestlib.a

2)对于步骤1中的每个目标文件(例如foo.o)

file foo.o 

这将告诉您目标文件的格式。如果为另一个平台编译了目标文件,则会导致无法为存档构建索引。 要纠正此问题,您需要重新编译这些文件 3)对于步骤1中的每个目标文件,执行

nm foo.o

这将列出从文件中导出的符号。

答案 1 :(得分:13)

当我收到错误时,我正在使用MinGW编译Windows应用程序,所以我找到了内置的MinGW命令:

i686-w64-mingw32-ar

并且

x86_64-w64-mingw32-ar

如果您在MinGW中遇到问题,请尝试使用这些代替ar。他们都为我解决了这个问题。

答案 2 :(得分:2)

libtool也有一个有用的选项: -export-symbols-regexp

答案 3 :(得分:0)

我在尝试编译NBIS库时遇到了完全相同的问题。

有一个选项
make install LIBNBIS=yes

创建包含其他存档文件的单个存档。 gcc链接器不能正常处理它,只是发出存档没有索引消息。解决方法是将存档保留为单独的文件

make install LIBNBIS=no

然后只需将应用程序链接到所需的存档即可。归档订阅源顺序非常重要,以确保链接器识别所需的依赖项,然后在处理.a文件时解析它们。