首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ 64位-无法读取符号:归档没有索引;运行ranlib添加一个

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

Stack Overflow用户
提问于 2011-04-06 00:44:49
回答 1查看 12.5K关注 0票数 4

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

whom,由此产生的.o将嵌入到静态库中。

代码语言:javascript
复制
void ctest1(int *i)
{
   *i=5;
}

和prog.cpp

代码语言:javascript
复制
#include <stdio.h>
void ctest1(int *);

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

   return 0;
}

如果我编译成32位,没问题:

-(0931:Wed,06/04月11:$ )-- g++ -m32 -Wall -c ctest1.cpp-(0931:Wed,06/04月11:$ )-文件ctest1.octest1.o: g++ -m32 -o prog prog.cpp libctest.a -(0931:g++-m32-o prog prog.cpp libctest.a-(0931:Wed)04月11日:$)-/程序值=5

但是,如果我尝试用64位编译,它在链接期间失败,错误是“无法读取符号:归档没有索引;运行ranlib添加一个”:

-(0933:Wed,06/04月11:$ )-- g++ -m64 -Wall -c ctest1.cpp-(0935:Wed,06/04月11:$ )-文件ctest1.octest1.o: ELF 64位LSB可重定位,amdx86-64,version 1 (SYSV),未剥离-(0933:Wed,06/ 11:$ )-- ar -cvq libctest.a ctest1.oa -ctest1.o-(0935:Wed,06年4月11日:$ )-- g++ -m64 -o prog prog.cpp libctest.alibctest.a:无法读取符号:归档没有索引;运行ranlib添加onecollect2: ld返回1退出状态

在libctest.a上运行ranlib不会改变任何事情。

我的Linux版本如下

-(0937: Wed,06/04月11:$ ) -aLinux dev1 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux

有人知道问题出在哪里吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-06 01:02:14

在用64位构建重新编译之前,您删除了库吗?

你的汇编顺序对我有用:

代码语言:javascript
复制
$ 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位时:

代码语言:javascript
复制
$ 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版本(并不是当前的所有版本):

代码语言:javascript
复制
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打印相同的版本:

代码语言:javascript
复制
GNU ar 2.17.50.0.6-9.el5 20061020

我不需要直接使用ranlib。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5560279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档