2011-04-06 62 views
4

我想使用靜態庫在Linux RHAS 5.3 64位上生成一個非常簡單的二進制文件。C++ 64位 - 無法讀取符號:歸檔沒有索引;運行ranlib添加一個

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:週三,11年4月6日:$) - - g ++ -m32 -Wall -c ctest1.cpp
- (0931:Wed,06 Apr 11:$) - file ctest1.o
ctest1.o:ELF 32位LSB可重新定位,Intel 80386,v版爲1(SYSV),不剝離
- (0931:週三,11年4月6日:$) - AR -cvq libctest.a ctest1.o
一個 - ctest1.o
- (0931:週三, 11年4月6日:$) - 克++ -m32 -o PROG prog.cpp libctest.a
- (0931:星期三,11年4月6日:$) - ./prog
Valx = 5

但是,如果我嘗試在64位編譯,它在鏈接期間失敗,出現錯誤「無法讀取符號:歸檔沒有索引;運行ranlib命令來添加一個「:

- (0933:週三,11年4月6日:$) - G ++ -m64 -Wall -c ctest1.cpp
- (0935:週三,11年4月6日:$) - 文件ctest1.o
ctest1.o:ELF 64位LSB可重新定位,AMD x86-64,版本1(SYSV),未去除
- (0933:Wed,06 Apr 11:$) - AR -cvq libctest.a ctest1.o
一個 - ctest1.o
- (0935:星期三,11年4月6日:$) - 克++ -m64 -o PROG prog.cpp libctest.a
libctest .a:無法讀取符號:存檔沒有索引;運行ranlib添加一個
collect2:ld返回1退出狀態

在libctest.a上運行ranlib不會更改任何內容。

我的Linux版本如下

- (0937:週三,11年4月6日:$) - UNAME -a
Linux的DEV1 2.6.18-128.el5#1 SMP星期三十二月17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux

有沒有人有一個想法,問題來自哪裏?

謝謝。

回答

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。

+0

是* .o,* .a et bin文件在兩代之間被刪除。 – paf 2011-04-06 01:12:34

+0

順便說一句GCC版本也是4.1.2 – paf 2011-04-06 01:13:04

+0

好的,我發現這個問題,我的機器上安裝的binutils版本很老! GNU ar 2.10.90。我更新了它,現在我正確鏈接。謝謝你的幫助! – paf 2011-04-06 06:12:02

相關問題