我正在尝试使用静态库在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位编译,则没问题:
但是,如果我尝试以64位进行编译,则在链接过程中它将失败,并显示错误“无法读取符号:存档没有索引;运行ranlib以添加一个”:
在libctest.a上运行ranlib不会更改任何内容。
我的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。