1

x64_86GNUlinuxアーキテクチャでg++バージョン4.1.2を使用しています。コードベースは非常に巨大で、プロジェクトで使用されるmakefileについて十分に理解していません。コードはそのままで正常にコンパイルされます。

デバッグの目的で、いくつg++ -Eかのソースファイルを個別に前処理()してから再コンパイルする必要があります。を使用して、必要なインクルードパスを指定して-Iいます。理想的には、コンパイルはうまくいくはずです。

しかし、次のような標準ヘッダーでいくつかの不一致が発生しています。

  1. typedef unsigned long size_t;コンパイラによって生成された宣言でエラーがoperator new() 発生します(手動に変更するとunsigned int 、このエラーは消えます)
  2. のようなライブラリ関数ではunsigned long numeric_limits<>::max()、コンパイラは922...807L;のような大きな数に対して文句を言います。コンパイラエラーを次のように生成しますinteger constant is too large for long type
  3. の不一致宣言__errorno_location()はコンパイラエラーを与えます

何が悪いのかを見つけるのに苦労しています。変更されていないファイルを作成するときにコンパイルがうまくいくのはなぜですか?またg++ -I <> -E、個々のファイルにオプションを指定すると、標準ヘッダーが壊れ始めるのはなぜですか?

(私たちが書いたコードには問題がないことに注意してください。これは標準ライブラリ側からのものです。typedefとしてstddef.h持っているものを見つけてみましたが、それで最初の問題が修正されました。)unsigned int

このエラーを修正するためのアイデアをいただければ幸いです。

4

2 に答える 2

1

プリプロセッサの出力をコンパイルするときは、-fpreprocessedコンパイラ オプションを使用して、プリプロセッサが再度実行されないようにしてください。

そのオプションを渡さないと、マクロのように見える識別子を生成した特定の構造が、展開されるべきではないものに再び展開される可能性があります。違いを示すケースを考え出すのは難しいです (できると確信していますが、少し困惑し、かなり不自然になるでしょう)。ただし、実装ヘッダーは、このオプションに敏感ないくつかの難解なマクロ手法を使用する可能性があります。

于 2012-05-17T18:04:47.423 に答える
1

前処理とコンパイルを別々に行わないでください。または、一貫したコンパイラ オプションと一貫した環境を使用する必要がある場合。

-m3232ビットマシンでプリプロセッサを実行している(またはオプションを使用している)後、64ビットマシンでコンパイルしているように聞こえます。

于 2012-05-17T17:54:30.483 に答える