在项目之间共享类,同时绕过 stdafx.h 依赖项

Posted

技术标签:

【中文标题】在项目之间共享类,同时绕过 stdafx.h 依赖项【英文标题】:Sharing classes between projects while getting around stdafx.h dependencies 【发布时间】:2016-06-14 01:44:37 【问题描述】:

我有一个 Visual Studio 2010 解决方案,其中包含几个密切相关的项目。想摆脱复制粘贴代码共享并在项目之间共享一些通用类。我们尝试将项目 A 中的类的引用添加到项目 B 中,但在共享类引用错误的 stdafx.h 文件时出现编译错误。请注意,两个项目的预编译头文件都处于启用状态(默认情况下)。

我们还了解到它是使用预处理器定义的not possible to #ifdef the correct stdafx.h 文件。

此时看起来我们的选择是构建一个静态库项目或多个项目并从项目 A 和 B 中引用它,或者尝试将正确的 stdafx.h 文件的一些预构建事件复制到共享代码子文件夹。第三是重新设计这两个项目以完全不使用 stdafx.h。

所有这些选项对我来说似乎都是多余的。有没有我想念的更简单的解决方案?

【问题讨论】:

我认为,最好的选择确实是使用公共代码创建一个静态库,正如您已经发现的那样...... 一种解决方案是在关闭预编译头文件的情况下进行构建。这完全摆脱了 stdafx.h。 您是否尝试过创建新过滤器并在该过滤器中添加来自其他项目的类。这有助于明确其他项目类的来源,您可以将 stdafx.h 添加到该过滤器中。 【参考方案1】:

当我读到你的问题时,我的脑海中突然出现的两个是:

    关闭预编译头文件。 将公共代码编译为共享库。

在您的实例 1 中,您可以更快地提高工作效率,但不要从项目中删除 stdafx,因为这意味着必须通过您的项目并关闭预编译头文件。只需删除您添加的所有内容并将其保留为两个项目的默认设置。自从我不得不这样做已经有一段时间了,但我想我会右键单击并单独编译每个 cpp 文件。这将为您提供该编译单元缺少的头文件。添加它们,然后冲洗并为每个重复。

通过静态分析运行代码将突出显示可以加速编译的内容(前向声明与包含等)。

【讨论】:

【参考方案2】:

当我遇到这个问题时,我通过以下方式解决了它:

    重命名所有特定于其项目的 stdafx.h 文件(stdafx_prj_A.h、stdafx_prj_B.h 等)。 此外,您需要更新每个解决方案以使用正确的预编译头文件。对此的设置位于配置属性 -> C/C++ -> 预编译头文件 -> 预编译头文件中。 不要忘记为所有配置和平台设置此设置。 注意安全。每个 StdAfx.cpp 只需要包含正确的头文件。所以不要在 1 个 StdAfx.cpp 文件中包含所有的 stdafx 标头。 将项目之间共享的任何类移动到它们自己的项目中。

这仍然允许您使用 PCH 文件,并且您不必担心编译器使用错误的文件。如果我没记错的话,VS 将为您创建的任何新类使用当前指定的 PCH 文件名。

【讨论】:

【参考方案3】:

我们使用原始源创建 .cxx 文件,#include "stdafx.h" 除外。这是实现类的主文件。

然后我们创建单独的项目特定 .cpp 文件,其中仅包含(例如 NumEdit.cpp

#include "stdafx.h"
#include "\pathtoimplementation\NumEdit.cxx"

然后每个项目的debugrelease 文件夹都有项目特定的.obj 文件。

【讨论】:

以上是关于在项目之间共享类,同时绕过 stdafx.h 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

MFC项目依赖 BCG框架示例

在多模块 maven 项目中的模块之间共享 src/test 类

sbt共享项目之间的依赖关系

如何在同一个 monorepo 中的 Python 项目之间共享开发依赖项?

是否应该从 C++ 中的静态库项目中删除 stdafx.h/.cpp? [关闭]

尝试构建现有项目,很多“无法打开包含文件:'StdAfx.h':没有这样的文件或目录”