事前にコンパイルされたヘッダーは、大規模なプロジェクトで多くの時間を節約することができるようですが、いくつかの問題を持っているような痛みを感じるようです。GNU/Linux環境/ツールチェーンで、あらかじめコンパイルされたヘッダの賛否両論は何ですか?
プリコンパイル済みヘッダーを使用する場合、特にGnu/gcc/Linux環境で使用する場合はどうすればよいでしょうか?&
事前にコンパイルされたヘッダーは、大規模なプロジェクトで多くの時間を節約することができるようですが、いくつかの問題を持っているような痛みを感じるようです。GNU/Linux環境/ツールチェーンで、あらかじめコンパイルされたヘッダの賛否両論は何ですか?
プリコンパイル済みヘッダーを使用する場合、特にGnu/gcc/Linux環境で使用する場合はどうすればよいでしょうか?&
プリコンパイル済みヘッダーの唯一のメリットは、ビルドが遅すぎるとプリコンパイルされたヘッダーが高速化する可能性があることです。潜在的な短所:
もっとメイクファイルの依存関係が正しくなるようにする。もし彼らが間違っていれば、あなたは間違ったことを素早く作ります。良くない。
原則として、すべてのヘッダーをプリコンパイルできるわけではありません。 (#includeの前にいくつかの#defineを置くことを考えてください)gccが実際に正しいのですか?どのくらいこの最先端の機能を信頼したいですか?
あなたのビルドが十分に高速である場合は、プリコンパイル済みヘッダーを使用する理由はありません。あなたのビルドがあまりにも遅い場合、私は(ディルクが上の権利である)& AT T nmakeなどccacheのようなツールを使用して給与
に比べて安価である高速なハードウェアを、購入
を検討したいです両方とも再コンパイルを避けるために信頼できるテクニックを使用します。
ccache gcc、g ++、gfortranへのキャッシングフロントエンドは...私にとって素晴らしい作品です。そのウェブサイトが言うように
は、単に 'ccacheはコンパイラキャッシュです。これは、-Eコンパイラ スイッチと、 のコンパイルを満たすことができるかどうかを検出するためのハッシュを使用して、 キャッシュを使用して、 C/C++ コンパイラへのキャッシュプリプロセッサとして機能します。これにより、多くの場合、一般的なコンパイルで5〜10倍のスピードアップが発生します。 Debianの/ Ubuntuで
apt-get install ccache
' を行うと名前
gcc
、
g++
、
gfortran
、
/usr/bin/ccache
から
c++
、...その時点で
/usr/local/bin
、たとえば、ソフト・リンクを作成します。いくつかの初期のコメントに応答し、これはより明確するために
[編集]:これは、コンパイル・ステップのより大きなチャンクをキャッシュすることにより、本質的に、プリコンパイルヘッダとソースを提供します。したがって、あらかじめコンパイルされたヘッダーに似たアイデアを使用し、それをさらに実行します。スピードアップは劇的になる可能性があります - ウェブサイトが言っているように5~10倍。
:
長所:
短所:あなたは多くのことを変更するヘッダーのためにそれらを使用する場合は
OPはGNU/Linuxについて尋ねました。 –
それにもかかわらず、proとconsはgccにも当てはまります。 –
プレーンCの場合、プリコンパイル済みのヘッダーは使用しません。あなたが言うように、それらは潜在的に問題を引き起こす可能性があり、前処理時間は通常のコンパイルに比べて実際には小さいです。
C++ヘッダーにはコンパイルに高価な大きなテンプレートコードが含まれていることがあるため、C++の場合、プリコンパイルされたヘッダーは多くの時間を節約できます。実践的な経験はありませんので、プロジェクトのコンパイルの節約量を測定することをお勧めします。そのためには、プリコンパイルされたヘッダーを使用してプロジェクト全体をコンパイルしてから、単一のオブジェクトファイルを削除し、そのファイルを再コンパイルするのにかかる時間を測定します。
ビルドシステムとしてcmakeを使用するQtプロジェクトでPCHを使用していますが、時間が大幅に節約されます。私はかなり古くなっていたので、いくつかの微調整が必要なPCH cmakeスクリプトを手に入れましたが、一般的に予想よりも設定が簡単でした。私は追加する必要があります、私は多くのcmakeの専門家ではありません。
私は現在、Qt(QtCore、QtGui、QtOpenGL)の大きな部分といくつかの安定したヘッダをまとめています。
長所:Qtのクラスの場合
短所:
私が話したほとんどの人から、「簡単にセットアップできます」ということは、あなたが得ることができるコンセンサスとは限りません。あなたは精緻化できますか? – Catskul
申し訳ありませんが、コメントの書式設定ができないため、これがラップされています。 CMakeLists.txtに 'include(PCHSupport)'と 'ADD_PRECOMPILED_HEADER(myprojectname $ {CMAKE_SOURCE_DIR} /pch.h)の2行を追加しました。プロジェクトの実装ファイルでは、最初に#include
The GNU gcc documentationは、あらかじめコンパイルされたヘッダーの可能性のある落とし穴について説明します。
実際にgccはPCHをうまく処理します。 pchをインクルードする前に#defineが存在する場合、pchは単に使用されず、通常のインクルードが使用されます。 PCHは現在gccで約5年間存在しており、もはや厳しい状況に直面しているとは限りません。 – hirschhornsalz
ccacheの上には、複数のマシン間でdistccを使用することもできます。 –
@drhirsch:私は慎重なgccユーザーです。新しいリリースがあるたびに、何かが壊れます。私のために、5年はまだ出血しています。 –