1

32ビットバイナリをうまくコンパイルするネットワークIOを実行するプログラムがあります

ただし、コンパイル時に -m64 オプションを設定すると、次のやや不可解なエラーが発生します。

In file included from /usr/include/sys/stream.h:22,
             from /usr/include/netinet/in.h:62,
             from /usr/include/sys/socket.h:221,
             from operation_networkio.cc:15:
/usr/include/sys/vnode.h:241: error: overflow in array dimension
/usr/include/sys/vnode.h:241: error: size of array `pad' is too large

私のプログラムでこのエラーを引き起こしている私のソースコード operation_networkio.cc の問題のある行は

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

誰かが私が間違っていることとこれを治す方法を教えてもらえますか? Solaris sparc で GCC を使用しています

4

2 に答える 2

1

最終的に、コンパイル時に -mfaster-structs オプションが有効になっていることがわかりました。

何らかの理由で、このオプションを削除すると、このビルドの問題が解決されます。これにより、32 ビット ビルドは機能しますが、64 ビット ビルドは失敗します。誰かがそれを説明できるなら、私は確かに理由を知りたいです

于 2012-03-25T15:07:19.750 に答える
0

これは確かに奇妙です。

http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/sys/vnode.h#286

これらのデータ構造が 64 バイトを超えることはあり得ません。または、これらのデータ構造を再定義するいくつかのファイルを含めた可能性があります。原因を確認するには、前処理された C コンパイラの出力を確認する必要があります。

g++ -E operation_networkio.cc -I... -D... -o preprocessed.cc

そのコマンドを実行した後、ファイルを確認する必要がありますpreprocessed.ccvn_vfslocks_entryその定義の周りのコードが期待どおりかどうかを検索して確認します。

于 2012-03-25T01:16:18.003 に答える