2012-02-10 8 views
5

-E-Pのオプション(vxWorksベースの組み込みプラットフォーム用にGCC 4.1.2を使用)を使用して前処理するソースファイルがあります。他のすべてのオプションは、ファイルをコンパイルするときと同じです。これらのオプションは、前処理済みのファイル変更をあらかじめコンパイルする

-Wall 
-march=pentium 
-nostdinc 
-O0 
-fno-builtin 
-fno-defer-pop 
-g 
-c 
-o 

とすべてのインクルードパスです。この前処理されたファイルをコンパイルすると、元のファイルを直接コンパイルした場合よりも、結果として得られるオブジェクトファイルがはるかに小さくなります(約30%)。そして、私がプログラムをリンクすると、リンカは、元のソースファイルを使用しているときに再び発生しない、シンボルの欠落(ユーザコード内のすべて)について苦情を言います。なぜ違いがありますか?この仕事をする方法はありますか?

答えて

1

-Dがコマンドラインから定義されていないことは確かですか?あなたの結果は、条件付きのためにコンパイルされていない部品と一貫しています。

vxWorks環境では、アーチ特有のクロスコンパイラではなく、汎用のgcc -Eを使用している可能性があります(特にコンパイラの名前を指定しないため)。クロスgccは、gcc -Eに必要ないくつかの変数を事前定義します。

+0

何も削除せずに '-E'と' -P'フラグを追加するだけでオブジェクトファイルを作成するルールを修正していますので、私は正しいコンパイラを使用していると確信しています。定義。 –

1

前処理された出力をコンパイルするときは、-fpreprocessedオプションを渡して、GCCに前処理を行わないように指示してください。

私が考えることができるのは、すでに展開されているマクロ名の識別子に展開されるマクロです。プリプロセッサはその時点で展開を停止しますが、プリプロセッサを再度実行した場合、識別子は再び展開されます。私はこれのインスタンスがおそらくコンパイラエラーを引き起こすと予想したでしょうが、誰が知っていますか?

関連する問題