54

プリコンパイル済みヘッダー ( stdafx.h) を使用する Visual Studio C++ ベースのプログラムがあります。現在、gcc 4.x を使用してアプリケーションを Linux に移植しています。

問題は、両方の環境でプリコンパイル済みヘッダーを処理する方法です。私はグーグルで検索しましたが、結論に達することはできません。

stdafx.hコード ベースがかなり大きく、プリコンパイル済みヘッダーによってコンパイル時間が短縮されるため、当然、Visual Studio に残しておきたいと思います。

しかし、問題は Linux で何をするかです。これは私が見つけたものです:

  1. そのままにしておきstdafx.hます。gcc は VC++ よりもかなり高速にコードをコンパイルします (または、私の Linux マシンの方が強力なだけです ... :)) ので、このオプションに満足しているかもしれません。
  2. hereからのアプローチを使用します-次のようにしstdafx.hます(USE_PRECOMPILED_HEADERVSのみに設定):

    #ifdef USE_PRECOMPILED_HEADER
    ... my stuff
    #endif 
    
  3. hereのアプローチを使用してください -各 cpp ファイル/FI暗黙的に含めるためにVC++ をコンパイルします。stdafx.hしたがって、VS では、コードを簡単に切り替えて、プリコンパイル済みヘッダーなしでコンパイルすることができ、コードを変更する必要はありません。
    私は個人的に依存関係が嫌いで、混乱stdafx.hが大きなコードベースを押し進めています。したがって、このオプションは私にとって魅力的です。Linuxstdafx.hでは/FI.

  4. Linux ではstdafx.h、プリコンパイル済みヘッダーとしてのみコンパイルします (Visual Studio を模倣)。

あなたの意見?問題を処理するための他のアプローチはありますか?

4

10 に答える 10

48

最速のコンパイルのために、プリコンパイル済みヘッダーを使用することをお勧めします。

gcc でもプリコンパイル済みヘッダーを使用できます。 ここ を参照してください

コンパイル済みプリコンパイル済みヘッダーには、拡張子が.gchではなく as が追加されます.pch

たとえば、stdafx.h をプリコンパイルするとstdafx.h.gch、インクルードするたびに呼び出されるプリコンパイル済みヘッダーが自動的に検索されます。stdafx.h

例:

stdafx.h:

#include <string>
#include <stdio.h>

a.cpp:

#include "stdafx.h"
int main(int argc, char**argv)
{
  std::string s = "Hi";
  return 0;
}

次に、次のようにコンパイルします。

> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out

ステップ 1 の後で stdafx.h を削除しても、コンパイルは機能します。

于 2009-07-28T00:00:24.887 に答える
3

前回、これと同じことをする必要があったときに、オプション 3を使用しました。私のプロジェクトはかなり小さいものでしたが、これは素晴らしく機能しました。

于 2009-07-28T00:00:51.030 に答える
2

オプション 4 またはオプション 2 のいずれかを選択します。さまざまな VS バージョンと Linux 上の GCC の両方でプリコンパイル済みヘッダーを試しました (これに関するブログ記事はこちらここ)。私の経験では、VS はインクルード パスの長さ、インクルード パス内のディレクトリの数、およびインクルード ファイルの数に対して、G++ よりもはるかに敏感です。ビルド時間を測定したところ、適切に配置されたプリコンパイル済みヘッダーは VS でのコンパイル時間に大きな違いをもたらしましたが、G++ はこれにほとんど感銘を受けませんでした。

実際、上記に基づいて、コンパイル時間を抑えるためにこれが必要なプロジェクトに最後に取り組んだときに行ったことは、Windowsでstdafx.hに相当するものをプリコンパイルすることでした。 Linux で。

于 2009-08-06T21:18:03.263 に答える
2

大規模な開発者チームでは、オプション 1 のみを使用します。オプション 2、3、および 4 は、多くの場合、チームの他のメンバーの生産性を停止させるため、コンパイル時間を 1 日に数分節約できます

理由は次のとおりです。

開発者の半分が VS を使用し、半分が gcc を使用していると仮定しましょう。時々、一部の VS 開発者は .cpp ファイルにヘッダーを含めることを忘れます。stdafx.h に暗黙的に含まれているため、彼は気づきません。そのため、彼が変更をバージョン管理にプッシュすると、gcc チームの他のメンバー数人がコンパイラ エラーを受け取ることになります。したがって、プリコンパイル済みヘッダーを使用することで得られる 1 日 5 分ごとに、欠落しているヘッダーを修正するために他の 5 人が無駄になります。

すべてのコンパイラで同じコードを共有しないと、このような問題が毎日発生します。VS 開発者に、変更をプッシュする前に gcc でコンパイルをチェックするように強制すると、プリコンパイル済みヘッダーを使用することによる生産性の向上がすべて台無しになります。

オプション 4 は魅力的に聞こえますが、ある時点で別のコンパイラを使用したい場合はどうでしょうか? オプション 4 は、VS と gcc のみを使用する場合にのみ機能します。

オプション 1 では、gcc のコンパイルに数秒かかる場合があることに注意してください。目立たないかもしれませんが。

于 2014-09-07T06:35:12.427 に答える
1

本当に簡単です:

Project->Project Settings (Alt + F7)

Project-Settings-Dialog:
C++ -> Category: Precompiled Headers -> Precompiled Headers ラジオ ボタン --> 無効化

于 2011-01-28T18:00:40.937 に答える
1

デフォルトではすべて Windows 固有のものなので、他のプラットフォームにstdafx.hは空を置きました。そうすれば、コードからすべての行を削除することなく、Linux でstdafx.h効果的に無効にしながら、ソース コードを同一に保つことができます。stdafx#include "stdafx.h"

于 2011-08-04T23:25:20.150 に答える
0

クロス プラットフォーム コードのオプション 2 (#ifdef) とオプション 4 (gcc の PCH) の両方を問題なく実行しました。

gcc は VS よりもはるかに高速にコンパイルされるため、巨大なヘッダー ファイルを参照していない限り、プリコンパイル済みヘッダーは通常それほど重要ではありません。

于 2009-07-28T00:08:25.807 に答える