2011-04-06 1 views
4

私は静的ライブラリを使ってLinux RHAS 5.3 64ビットで非常に単純なバイナリを生成しようとしています。C++ 64ビット - シンボルを読み取れませんでした:アーカイブにインデックスがありません。 runlibを実行して1つ追加する

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:水曜日、4月6日11:$) - -g ++ -m32 -Wall -c ctest1.cpp
- (0931:Wed、06 Apr 11:$) - ファイルctest1.o
ctest1.o:ELF 32ビットLSBリロケータブル、Intel 80386、v ERSION 1(SYSV)、
を取り除かない - (0931:水曜日、4月6日11:$) - AR -cvq libctest.a ctest1.o
- ctest1.o
- (0931:水、 4月06日11:$) - G ++ -m32 -o PROG prog.cpp libctest.a
- (0931:水、4月06日11:$)は -
Valx = 5

を./prog

しかし、私が64ビットでコンパイルしようとすると、リンク中に "シンボルを読み取れませんでした:アーカイブにインデックスがありません。 「1を追加するRANLIBを実行します。

- (0933:水曜日、4月6日11:$) - G ++ -m64 -Wall -c ctest1.cpp
- (0935:水曜日06 4月11日:水、4月6日11::$) - : - $)ファイル
ctest1.o ctest1.o(0933)ELF 64ビットLSB再配置可能な、AMDのx86-64で、バージョン1(SYSV、
取り除きません - AR -cvq libctest.a ctest1.o
- ctest1.o
- (0935:水曜日、4月6日11:$) - G ++ -m64 -o progのprog.cpp libctest.a
libctest .a:シンボルを読み取ることができませんでした:アーカイブにインデックスがありません; ranlibを実行して1つを追加してください
collect2:ldが1の終了ステータスを返しました。

libctest.aでranlibを実行しても何も変更されません。

私のLinuxバージョンは、次の

である - (0937:水曜日、4月6日11:$) - のuname -a
Linuxは2.6.18-128.el5#1 SMP水12月をDEV1 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ビットをコンパイルした場合:

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 

$ 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のリリース(すべてが最新ではありません)です

My GCCはバージョン4.1.2です。私のARバージョンは以下の通りです。

GNU ar 2.17.50.0.6-9.el5 20061020 

私はranlibを直接使う必要はありませんでした。

+0

はい* .o、* .aとbinファイルが両方の世代で削除されました。 – paf

+0

BTW GCCのバージョンも4.1.2 – paf

+0

です。問題は見つかりました。私のマシンにインストールされているbinutilsのバージョンは非常に古いです! GNU ar 2.10.90。私はそれを更新し、今私は適切にリンクします。ご協力いただきありがとうございます! – paf

関連する問題