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

时间:2011-04-06 00:44:50

标签: c++ linker 64-bit

我正在尝试使用静态库在Linux RHAS 5.3 64bits上生成一个非常简单的二进制文件。

test1.cpp ,结果.o将嵌入到静态库中。

void ctest1(int *i)
{
   *i=5;
}

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位LSB可重定位,Intel 80386,版本1(SYSV),未剥离   
- (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:3月6日星期三,11:$) - ./prog   
Valx = 5

但是,如果我尝试以64位进行编译,则会在链接期间失败并显示错误“无法读取符号:存档没有索引;运行ranlib以添加一个”:

  

- (0933:Wed,06 Apr 11:$) - g ++ -m64 -Wall -c ctest1.cpp   
- (0935:Wed,06 Apr 11:$) - file ctest1.o   
ctest1.o:ELF 64位LSB可重定位,AMD x86-64,版本1(SYSV),未剥离   
- (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:无法读取符号:存档没有索引;运行ranlib添加一个   
collect2:ld返回1退出状态

在libctest.a上运行ranlib不会改变任何内容。

我的Linux版本如下

  

- (0937:3月6日星期三,11:$) - uname -a   
Linux dev1 2.6.18-128.el5#1 SMP Wed Dec 17 17:41:38 EST 2008 x86_64 x86_64 x86_64 GNU / Linux

有没有人知道问题的来源?

感谢。

1 个答案:

答案 0 :(得分: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。