我有一个基于 Visual Studio C++ 的程序,它使用预编译的头文件 ( stdafx.h )。现在我们正在使用 gcc 4.x 将应用程序移植到 Linux。

问题是如何在两种环境中处理预编译的头文件。
我用谷歌搜索但无法得出结论。

显然,我想在 Visual Studio 中保留 stdafx.h,因为代码库非常大,并且预编译的头文件加快了编译时间。

但问题是在 Linux 中该做什么。这是我发现的:

  • 保持 stdafx.h 不变。 gcc 编译代码比 VC++ 快得多(或者只是我的 Linux 机器更强大...... :)),所以我可能对这个选项感到满意。
  • 使用来自 here 的方法 - 使 stdafx.h 看起来像(仅针对 VS 设置 USE_PRECOMPILED_HEADER):
    #ifdef USE_PRECOMPILED_HEADER
    ... my stuff
    #endif
    
  • 使用来自 here 的方法 - 用 /FI 编译 VC++ 到 隐式包含每个文件 0x25181921 0x25181921 34102131313131313131313131313131313131313131313131313之间分别包含因此,在 VS 中,您的代码可以轻松切换为无需预编译头文件即可编译,并且无需更改任何代码。
    我个人不喜欢依赖关系,而困惑的 stdafx.h 正在插入一个大的代码库。因此,该选项对我很有吸引力 - 在 Linux 上,您没有 stdafx.h ,同时仍然只能通过 stdafx.h 打开 VS 上的预编译头文件。
  • 在 Linux 上编译 /FI 仅作为预编译头文件(模仿 Visual Studio)

  • 你的意见?是否有其他方法来处理这个问题?

    最佳答案

    您最好仍然使用预编译的头文件以获得最快的编译速度。

    您也可以在 gcc 中使用预编译头文件。 See here

    编译后的预编译头将附加一个扩展名 .gch 而不是 .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;
    }
    

    然后编译为:



    即使您在第 1 步之后删除 stdafx.h,您的编译也能正常工作。

    关于c++ - 在跨平台代码中处理 stdafx.h,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1191248/

    10-13 08:07