9

gcc (として実行g++) と GNU make を使用します。gcc を使用してヘッダー ファイルをプリコンパイルしprecompiled.h、作成しprecompiled.h.gchます。Makefile の次の行がそれを行います。

# MYCCFLAGS is a list of command-line parameters, e.g. -g -O2 -DNDEBUG
precompiled.h.gch: precompiled.h
    g++ $(MYCCFLAGS) -c $< -o $@

g++さまざまなコマンドライン パラメーターを指定して実行する必要が生じるまでは、すべて問題ありませんでした。この場合、precompiled.h.gch存在していても使用できず、コンパイルは非常に遅くなります。この状況を処理するために読んだ gcc のドキュメントでは、ディレクトリを作成し、そこにプリコンパイル済みヘッダー ファイルを配置する必要があります。コマンド ライン パラメーターprecompiled.h.gchのセットごとに 1 つのファイルです。g++

だから今、g++この方法でgchファイルを作成するようにMakefileを変更する方法を考えています。g++ディレクトリ内の既存のファイルを使用できるかどうかをテストするためだけに実行しprecompiled.h.gch、そうでない場合は、一意のファイル名で新しいプリコンパイル済みヘッダーを生成できます。

gcc はそのようなテストをサポートしていますか?

多分私は別の方法で私が欲しいものを実装できますか?

4

2 に答える 2

5

私自身の質問に答えるのは奇妙に思えます。とにかく、ここに行きます。

適切なプリコンパイル済みヘッダー ファイルが存在するかどうかを検出するために、ヘッダー ファイルに意図的なエラーを追加します。

// precompiled.h
#include <iostream>
#include <vector>
...
#error Precompiled header file not found

これが機能するのは、gcc がプリコンパイル済みヘッダーを見つけた場合、.hファイルを読み取らず、エラーが発生しないためです。

このようなファイルを「コンパイル」するには、最初にエラーを削除し、結果を一時ファイルに配置します。

grep -v '#error' precompiled.h > precompiled.h.h
g++ -c -x c++ $(MYCCFLAGS) precompiled.h.h -o MORE_HACKERY

ここで MORE_HACKERY は単なるファイル名ではなく、一意の名前 ( mktemp) を持つファイルを作成するためのコードが含まれています。わかりやすくするために省略しました。

于 2010-12-26T20:00:59.897 に答える
2

precompiled.h に #error を導入するよりも簡単な方法があります。このファイルをまったく作成しないでください。G++ も Visual C++ (少なくとも 2005 年まで) も、プリコンパイルされたバージョンが存在する場合 (および必要なコンパイル フラグを取得する場合)、「実際の」ファイルがそこにあるとは想定していません。

プリコンパイルしたい #includes のリストが「to_be_precompiled.cpp」と呼ばれているとしましょう。ファイル名の拡張子はそれほど重要ではありませんが、これを .h ファイルと呼ぶのは好きではありません。これは、本物のヘッダー ファイルとは異なる方法で使用する必要があり、Visual C++ では .cpp の方が簡単だからです。 . 次に、コード全体で参照する別の名前を選択します。たとえば、「precompiled_stuff」とします。繰り返しますが、私はこれを .h ファイルと呼ぶのは好きではありません。これはファイルではなく、プリコンパイルされたデータを参照するための名前だからです。

次に、他のすべてのソース ファイルでは、ステートメント#include "precompiled_stuff"は正規のインクルードではなく、プリコンパイルされたデータをロードするだけです。プリコンパイルされたデータを準備するのはあなた次第です。

  • g++ の場合、名前がコンパイラにとって重要ではないソース ファイルから "precompiled_stuff.gch" を作成するためのビルド ルールが必要です (ただし、ここでは "to_be_precompiled.cpp" になります)。
  • Visual C++ では、文字列 "precompiled_stuff" は /Yu フラグの値と等しく、ロードされるプリコンパイル済みデータは、無関係なソース ファイル (ここでも "to_be_precompiled.cpp") から作成した、無関係な名前の .pch ファイルから取得されます。 )。
  • プリコンパイル済みヘッダーをサポートしないコンパイラでビルドする場合のみ、ビルド ルールは「precompiled_stuff」と呼ばれる実際のファイルを、できれば実際のソース ファイルから離れたビルド ディレクトリに生成する必要があります。「precompiled_stuff」は、「to_be_precompiled.cpp」のコピー、ハード リンクまたはシンボリック リンク、または#include "to_be_precompiled.cpp".

言い換えれば、すべてのコンパイラがプリコンパイルをサポートしているという観点を取りますが、一部のコンパイラにとっては単なるコピーです。

于 2015-02-20T16:45:54.027 に答える