代码之家  ›  专栏  ›  技术社区  ›  dimba

在跨平台代码中处理stdafx.h

  •  53
  • dimba  · 技术社区  · 15 年前

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

    问题是如何在两个环境中处理预编译的头文件。 我在谷歌上搜索了一下,但没能得出结论。

    显然我想离开 STDAFX 在Visual Studio中,由于代码库很大,预编译的头会增加编译时间。

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

    1. 离开 STDAFX 就这样。gcc编译代码的速度比vc++快得多(或者它只是我的Linux机器更强…:)),所以我可能对这个选择很满意。
    2. 使用来自的方法 here -使 STDAFX 看起来像(设置) USE_PRECOMPILED_HEADER 仅针对VS):

      #ifdef USE_PRECOMPILED_HEADER
      ... my stuff
      #endif 
      
    3. 使用来自的方法 here -用编译VC++ /FI 隐含地 包括 STDAFX 在每个cpp文件中。因此,在VS中,您的代码可以很容易地切换到没有预编译头的情况下进行编译,并且不需要更改任何代码。
      我个人不喜欢依赖和混乱 STDAFX 正在推动一个大型代码库的发展。因此,这个选项对我很有吸引力-在Linux上,你没有 STDAFX ,同时仍然能够打开vs上的预编译头 /FI 只有。

    4. 在Linux编译上 STDAFX 仅作为预编译头(Mimic Visual Studio)

    你的意见?还有其他方法来处理这个问题吗?

    10 回复  |  直到 6 年前
        1
  •  46
  •   Brian R. Bondy    15 年前

    最好还是使用预编译头进行最快的编译。

    您也可以在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;
    }
    

    然后编译为:

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

    即使在步骤1之后删除stdafx.h,编译也会工作。

        2
  •  3
  •   Kredns    15 年前

    我用过 option 3 上次我需要做同样的事情。我的项目很小,但效果很好。

        3
  •  2
  •   Timo Geusch    15 年前

    我要么选择4号方案,要么选择2号方案。我已经在不同的vs版本和Linux上的gcc上对预编译头文件进行了试验(关于这个的博客文章 here here )根据我的经验,与g++相比,vs对include路径的长度、include路径中目录的数量和include文件的数量更为敏感。当我测量构建时间时,正确地安排预编译头文件将对vs下的编译时间产生巨大的影响,而g++对此几乎没有任何影响。

    实际上,基于上面的内容,我上一次在一个项目中工作时所做的是在Windows下预编译相当于stdafx.h的文件,在Windows下它是有意义的,并且在Linux下简单地将其用作常规文件。

        4
  •  2
  •   Bikramjit singh    11 年前

    非常简单的解决方案。 在Linux环境中为“stdafx.h”添加一个虚拟文件条目。

        5
  •  2
  •   Grim Fandango    10 年前

    我只会在一个大型开发团队中使用选项1。 选项2、3和4通常会使团队中其他成员的工作效率下降,因此 一天可以节省几分钟的编译时间。

    这就是为什么:

    假设一半的开发人员使用vs,一半使用gcc。 有时候,一些vs开发人员会忘记在.cpp文件中包含一个头文件。 他不会注意到,因为stdafx.h隐式地包含了它。因此,他推动了版本控制中的更改,然后GCC团队的其他一些成员将得到编译器错误。 因此,每天使用预编译头文件,每5分钟就有5个人通过修复丢失的头文件而浪费时间。

    如果不在所有编译器中共享相同的代码,每天都会遇到这样的问题。如果在推动更改之前强制VS开发人员检查GCC上的编译,那么您将放弃使用预编译头获得的所有生产力收益。

    选项4听起来很吸引人,但是如果您希望在某个时间点使用另一个编译器呢?选项4只在您只使用vs和gcc的情况下有效。

    注意,选项1可能会使gcc编译遭受几秒钟的时间。尽管它可能不明显。

        6
  •  1
  •   Stefan Steiger Marco van de Voort    14 年前

    这很简单,真的:

    项目->项目设置(Alt+F7)

    项目设置对话框:
    C++& GT;类别:预编译头-&预编译头标题单选按钮-gt;禁用

        7
  •  1
  •   icedwater PedroMorgan    11 年前

    自从 stdafx.h 默认情况下是所有特定于Windows的内容,我已将 STDAFX 在我的另一个站台上。这样,源代码保持不变,同时有效地禁用 stdafx 在Linux上,不必删除所有 #include "stdafx.h" 代码中的行。

        8
  •  1
  •   Roman Kruglov    8 年前

    如果您在项目中使用cmake,那么有一些模块可以为您自动化它,非常方便,例如请参见 CMAKE预编译头 here . 要使用它,只需包括模块和调用:

    include( cmake-precompiled-header/PrecompiledHeader.cmake )
    add_precompiled_header( ${target} ${header} FORCEINCLUDE SOURCE_CXX ${source} )
    

    另一个模块调用 科蒂尔 创建要预编译的头文件(无需手动写入stdafx.h),并以其他方式加快生成速度-请参阅 here .

        9
  •  0
  •   rahularyansharma    15 年前

    对于跨平台代码,我已经完成了选项2(ifdef)和选项4(pch for gcc),没有任何问题。

    我发现gcc的编译速度比vs快得多,所以预编译头通常没有那么重要,除非您引用了一些巨大的头文件。

        10
  •  0
  •   zzxyz    6 年前

    我有一种情况,特别是2不适合我(有许多vs构建配置,其中 #ifdef 围绕 #include "stdafx.h" 不起作用)。其他的解决方案是次优的,因为文件本身是跨项目的,也是跨平台的。我不想强制设置预处理器宏,也不想强制Linux甚至Windows版本使用(或不使用)PCH,所以…

    我做了什么,给了一个名为 notificationEngine.cpp 例如,删除了 #include stdafx.h 行,在同一目录中创建了一个新文件,名为 pchNotificationEngine.cpp 包括以下内容:

    #include "stdafx.h"
    #include "notificationEngine.cpp"
    

    任何给定的项目都只能包含文件的正确版本。诚然,对于仅由单个项目使用的cpp文件,这可能不是最佳选择。