加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:56:05 所属栏目:百科 来源:网络整理
导读:我试图使用静态库在 Linux RHAS 5.3 64bits上生成一个非常简单的二进制文件. test1.cpp,其结果.o将嵌入到静态库中. void ctest1(int *i){ *i=5;} 和prog.cpp #include stdio.hvoid ctest1(int *);int main(){ int x; ctest1(x); printf("Valx=%dn",x); retu
我试图使用静态库在 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=%dn",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位进行编译,则在链接期间失败,错误“无法读取符号:存档没有索引;运行ranlib添加一个”:

–(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,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

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

谢谢.

解决方法

在使用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,not stripped
prog.o: ELF 64-bit LSB relocatable,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,not stripped
prog.o:  ELF 32-bit LSB relocatable,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,for GNU/Linux 2.6.9,dynamically linked (uses shared libs),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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读