gpt4 book ai didi

C++ 64 位 - 无法读取符号 : Archive has no index; run ranlib to add one

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:55 31 4
gpt4 key购买 nike

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

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

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

谢谢。

最佳答案

您是否在使用 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。

关于C++ 64 位 - 无法读取符号 : Archive has no index; run ranlib to add one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5560279/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com