2009-08-27 23 views
24

事前にコンパイルされたヘッダーは、大規模なプロジェクトで多くの時間を節約することができるようですが、いくつかの問題を持っているような痛みを感じるようです。GNU/Linux環境/ツールチェーンで、あらかじめコンパイルされたヘッダの賛否両論は何ですか?

プリコンパイル済みヘッダーを使用する場合、特にGnu/gcc/Linux環境で使用する場合はどうすればよいでしょうか?&

答えて

10

プリコンパイル済みヘッダーの唯一のメリットは、ビルドが遅すぎるとプリコンパイルされたヘッダーが高速化する可能性があることです。潜在的な短所:

  • もっとメイクファイルの依存関係が正しくなるようにする。もし彼らが間違っていれば、あなたは間違ったことを素早く作ります。良くない。

  • 原則として、すべてのヘッダーをプリコンパイルできるわけではありません。 (#includeの前にいくつかの#defineを置くことを考えてください)gccが実際に正しいのですか?どのくらいこの最先端の機能を信頼したいですか?

あなたのビルドが十分に高速である場合は、プリコンパイル済みヘッダーを使用する理由はありません。あなたのビルドがあまりにも遅い場合、私は(ディルクが上の権利である)& AT T nmakeなどccacheのようなツールを使用して給与

  • に比べて安価である高速なハードウェアを、購入

    • を検討したいです両方とも再コンパイルを避けるために信頼できるテクニックを使用します。

  • +3

    実際にgccはPCHをうまく処理します。 pchをインクルードする前に#defineが存在する場合、pchは単に使用されず、通常のインクルードが使用されます。 PCHは現在gccで約5年間存在しており、もはや厳しい状況に直面しているとは限りません。 – hirschhornsalz

    +0

    ccacheの上には、複数のマシン間でdistccを使用することもできます。 –

    +0

    @drhirsch:私は慎重なgccユーザーです。新しいリリースがあるたびに、何かが壊れます。私のために、5年はまだ出血しています。 –

    5

    ccache gcc、g ++、gfortranへのキャッシングフロントエンドは...私にとって素晴らしい作品です。そのウェブサイトが言うように

    ccacheはコンパイラキャッシュです。これは、-Eコンパイラ スイッチと、 のコンパイルを満たすことができるかどうかを検出するためのハッシュを使用して、 キャッシュを使用して、 C/C++ コンパイラへのキャッシュプリプロセッサとして機能します。これにより、多くの場合、一般的なコンパイルで5〜10倍のスピードアップが発生します。 Debianの/ Ubuntuで

    は、単に ' apt-get install ccache' を行うと名前 gccg++gfortran/usr/bin/ccacheから c++、...その時点で /usr/local/bin、たとえば、ソフト・リンクを作成します。いくつかの初期のコメントに応答し、これはより明確するために

    [編集]:これは、コンパイル・ステップのより大きなチャンクをキャッシュすることにより、本質的に、プリコンパイルヘッダとソースを提供します。したがって、あらかじめコンパイルされたヘッダーに似たアイデアを使用し、それをさらに実行します。スピードアップは劇的になる可能性があります - ウェブサイトが言っているように5~10倍。

    +6

    -1:これはあらかじめコンパイルされたヘッダーとは関係ありません。 – quamrana

    +6

    これはプリコンパイルされたヘッダーとは関係ありません。 –

    +3

    @Martin:プリコンパイルされたヘッダーは無用にレンダリングされます。コンパイル済みヘッダーがなくても、コンパイル時間を短縮します。 – elcuco

    8
    私はGNU/gccの/ linuxのに話すことはできませんが、私はVS2005で、プリコンパイルヘッダを扱ってきた

    長所:

    • はあなたが大規模なヘッダを持っているときの時間をコンパイル節約いますたくさんのモジュール が含まれています。
    • ヘッダー(つまり、第三者から)がうまく動作し、まれに が変更されます。

    短所:あなたは多くのことを変更するヘッダーのためにそれらを使用する場合は

    • 、 それはコンパイル時間を増やすことができます。
    • セットアップとメンテナンスが面倒なことがあります。
    • コンパイル済みヘッダーを強制的にコンパイルしないと、ヘッダーの変更が明らかに無視されることがあります。
    +0

    OPはGNU/Linuxについて尋ねました。 –

    +7

    それにもかかわらず、proとconsはgccにも当てはまります。 –

    4

    プレーンCの場合、プリコンパイル済みのヘッダーは使用しません。あなたが言うように、それらは潜在的に問題を引き起こす可能性があり、前処理時間は通常のコンパイルに比べて実際には小さいです。

    C++ヘッダーにはコンパイルに高価な大きなテンプレートコードが含まれていることがあるため、C++の場合、プリコンパイルされたヘッダーは多くの時間を節約できます。実践的な経験はありませんので、プロジェクトのコンパイルの節約量を測定することをお勧めします。そのためには、プリコンパイルされたヘッダーを使用してプロジェクト全体をコンパイルしてから、単一のオブジェクトファイルを削除し、そのファイルを再コンパイルするのにかかる時間を測定します。

    0

    ビルドシステムとしてcmakeを使用するQtプロジェクトでPCHを使用していますが、時間が大幅に節約されます。私はかなり古くなっていたので、いくつかの微調整が必​​要なPCH cmakeスクリプトを手に入れましたが、一般的に予想よりも設定が簡単でした。私は追加する必要があります、私は多くのcmakeの専門家ではありません。

    私は現在、Qt(QtCore、QtGui、QtOpenGL)の大きな部分といくつかの安定したヘッダをまとめています。

    長所:Qtのクラスの場合

    • 、何の前方宣言は必要ありません、そしてもちろん何も含まれていません。
    • 高速です。
    • セットアップが簡単です。

    短所:

    • あなたはPCHを含めることはできませんヘッダーに含まれています。これはあまり問題ではありませんが、Qtを使用して、ビルドシステムがmocファイルを別々に翻訳するようにします。これはまさに私の設定です。この場合、ヘッダーにはqtヘッダーが#​​includeされている必要があります。これは、mocがヘッダーから生成されるためです。解決策は、ヘッダーに#includeの周りに追加のインクルードガードを置くことでした。
    +0

    私が話したほとんどの人から、「簡単にセットアップできます」ということは、あなたが得ることができるコンセンサスとは限りません。あなたは精緻化できますか? – Catskul

    +0

    申し訳ありませんが、コメントの書式設定ができないため、これがラップされています。 CMakeLists.txtに 'include(PCHSupport)'と 'ADD_PRECOMPILED_HEADER(myprojectname $ {CMAKE_SOURCE_DIR} /pch.h)の2行を追加しました。プロジェクトの実装ファイルでは、最初に#include を使用します。 automocを使用するqtビルドシステムの分離のため、pch.hをヘッダにインクルードする必要があります。これは追加のインクルードガードで動作します。後者は実際には分かりにくい部分でしたが、1時間もかかっていませんでしたので、「簡単」と考えています。 – hirschhornsalz

    4

    The GNU gcc documentationは、あらかじめコンパイルされたヘッダーの可能性のある落とし穴について説明します。

    関連する問題