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

4
我正在尝试在Linux RHAS 5.3 64位系统上使用静态库生成一个非常简单的二进制文件。 test1.cpp将生成.o文件并嵌入到静态库中。
void ctest1(int *i)
{
   *i=5;
}

and prog.cpp

#include <stdio.h>
void ctest1(int *);

int main()
{
   int x;
   ctest1(&x);
   printf("Valx=%d\n",x);

   return 0;
}

如果我使用32位编译,没有问题:
--(0931:Wed,06 Apr 11:$ )-- g++ -m32 -Wall -c ctest1.cpp --(0931:Wed,06 Apr 11:$ )-- file ctest1.o ctest1.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped --(0931:Wed,06 Apr 11:$ )-- ar -cvq libctest.a ctest1.o a - ctest1.o --(0931:Wed,06 Apr 11:$ )-- g++ -m32 -o prog prog.cpp libctest.a --(0931:Wed,06 Apr 11:$ )-- ./prog Valx=5
然而,如果我尝试64位编译,则在链接时会失败,出现错误“could not read symbols: Archive has no index; run ranlib to add one”:
--(0933:Wed,06 Apr 11:$ )-- g++ -m64 -Wall -c ctest1.cpp --(0935:Wed,06 Apr 11:$ )-- file ctest1.o ctest1.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped --(0933:Wed,06 Apr 11:$ )-- ar -cvq libctest.a ctest1.o a - ctest1.o --(0935:Wed,06 Apr 11:$ )-- g++ -m64 -o prog prog.cpp libctest.a libctest.a: could not read symbols: Archive has no index; run ranlib to add one collect2: ld returned 1 exit status
在libctest.a上运行ranlib并没有改变任何东西。
我的Linux版本如下:
--(0937:Wed,06 Apr 11:$ )-- uname -a Linux dev1 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
有人知道问题出在哪里吗?
谢谢。
1个回答

1
你在用64位编译之前是否删除了库?
你的编译顺序对我有效:
$ g++ -m64 -Wall -c prog.cpp
$ g++ -m64 -Wall -c test1.cpp
$ ar -cvq libtest.a test1.o
a - test1.o
$ g++ -m64 -Wall -o prog1 prog.o libtest.a
$ file test1.o prog.o
test1.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
prog.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
$ ./prog1
Valx=5
$ 

当我编译32位时:

$ g++ -m32 -Wall -c prog.cpp
$ g++ -m32 -Wall -c test1.cpp
$ file test1.o prog.o
test1.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
prog.o:  ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ ar -cvq libtest.a test1.o
a - test1.o
$ g++ -m32 -Wall -o prog1 prog.o libtest.a
/usr/bin/ld: warning: i386:x86-64 architecture of input file `libtest.a(test1.o)' is incompatible with i386 output
$ file prog1
prog1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$ ./prog1
Memory fault 
$ 

这是一些RHEL 5版本(并不是最新的):

Linux toru 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux

我的GCC版本是4.1.2。我的AR版本如下,而RANLIB打印相同的版本:

GNU ar 2.17.50.0.6-9.el5 20061020

我不需要直接使用ranlib。


是的,*.o、*.a和bin文件在两个版本之间被删除了。 - paf
顺便提一下,GCC版本也是4.1.2。 - paf
好的,我找到问题了,我的机器上安装的binutils版本非常旧!GNU ar 2.10.90。我已经更新了它,现在链接正常了。感谢您的帮助! - paf
@paf:很高兴能够提供帮助! - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接