在项目之间共享类,同时绕过 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"
然后每个项目的debug
和release
文件夹都有项目特定的.obj
文件。
【讨论】:
以上是关于在项目之间共享类,同时绕过 stdafx.h 依赖项的主要内容,如果未能解决你的问题,请参考以下文章
在多模块 maven 项目中的模块之间共享 src/test 类
如何在同一个 monorepo 中的 Python 项目之间共享开发依赖项?