4

Suse Linux、gcc4.1.2を実行しているPowerPC64ベースのマシンであるBlueGeneスーパーコンピューター上でGoogleProtocolbuffersとKyotocabinetを構築しようとしています。

コードをコンパイルすると、GoogleProtocolbuffersとKyotocabinetの両方で「skipingincompatible」エラーが発生しました。コマンドラインをコンパイルします。

g++ -g -Xlinker -zmuldefs -I/some_path/include $sourceFile -o $fileName -L/some_path/lib -lkyotocabinet -lz -lstdc++ -lrt -lpthread -lm -lc -lprotobuf -lprotoc meta.pb.cc

次に、を使用してインストールを変更しました。./configure --host=powerpc-bgp-linux今回はGoogle Protocolbuffersが機能しますが、Kyotocabinetでは次のようなエラーが発生します。

/usr/bin/ld: skipping incompatible /some_path/lib/libkyotocabinet.so when searching for -lkyotocabinet
/usr/bin/ld: skipping incompatible /some_path/lib/libkyotocabinet.a when searching for -lkyotocabinet
/usr/bin/ld: cannot find -lkyotocabinet
collect2: ld returned 1 exit status

config.status私はそれらをチェックしました、GoogleProtocolbuffersはこのようなものを持っています

sys_lib_search_path_spec='/usr/lib/gcc/powerpc64-suse-linux/4.1.2 /usr/powerpc64-suse-linux/lib /usr/lib /lib'

どうやらそれは使用する適切なものを見つける方法を知っています。しかし、Kyotocabinetはconfig.statusにこの種の設定を持っていません。このヒントがお役に立てば幸いです。

BlueGeneでKyotocabinetを使用できるようにするための解決策はありますか?または、上記のような行を追加して、Kyotocabinetに正しいlibの場所を指示することはできますか?または、いくつかの高速なKey-Valueストアをお勧めしますか?

4

1 に答える 1

2

あなたの問題は京都キャビネットを見つけることではありません。あなたの問題は、あなたが指しているライブラリが/some_path/lib/libkyotocabinet.so互換性のないアーキテクチャ用に構築されていることです(ほとんどの場合ppc32)。

file -L /some_path/lib/libkyotocabinet.soそれが何を言っているか見てみましょう。デフォルトで生成されるものと同じアーキテクチャ用に再構築する必要があります。gcc

更新:fileと言いELF 64-bit MSB shared object, 64-bit PowerPCます。しかし、それはg++デフォルトであなたの出力と一致しますか?からの出力は何ですか:

echo "int foo() { return 0; }" | g++ -xc++ - -c -o foo.o &&
file foo.o

上記のように印刷32-bit PowerPCされます。その場合は-m64、コマンドラインに追加する必要があります。

アップデート2:

この問題のアイデアはありますか?

あなたはそんなに無力であってはなりません。問題がライブラリの不一致であることを理解しているので、それを修正してください。

  1. 最終的なバイナリを32ビットモードと64ビットモードのどちらで実行するかを決定します
  2. 必要なすべてのライブラリを必要なビット数で取得または再構築します
  3. 最終的なバイナリをビルドする
  4. 利益!
于 2011-10-26T05:32:08.007 に答える