【发布时间】:2021-05-22 09:31:14
【问题描述】:
假设我们有一个现有的 Visual Studio 2019 解决方案,该解决方案无法使用其他工具从头开始生成,例如CMake。
该解决方案包含三个项目:A、B 和 C,每个项目只包含一个文件,这是一个最小示例:
/// Project A, A.hpp
// content irrelevant
/// Project B, B.hpp
#include <A.hpp> // B's public interface includes A's header
/// Project C.cpp
#include <B.hpp> // C requires B's header, which includes A's header, to compile
习惯了 CMake 的“基于目标”的方法,我天真地认为我可以处理以下情况:
- B 引用 A,
- C 引用 B
然而,在这种情况下,C 只使用 B 的包含路径,但不使用 A 的包含路径。因此 C 不能编译。
“让它工作”的“解决方法”是显而易见的:将 A 的包含路径添加到 C,它会编译。但我们知道,随着项目数量的增长,这种规模会变得非常可怕:
> /// Project C2, C2.cpp
> #include <B.hpp> // requires B interface to compile
> /// Project C3, C3.cpp
> #include <B.hpp> // requires B interface to compile
> /// Project C4, C5, ... and on and on
我不必在许多项目中指定 B 接口的需求,而是寻找 CMake 提供的功能:在 B 项目本身中定义 B 的需求(在我的情况下:包含路径),仅此而已。
我的问题是:如何完全在 Visual Studio 2019 IDE 中实现这一目标?
【问题讨论】:
-
您想要 CMake 解决方案还是纯 VS 解决方案?据我了解,您不想要 CMake - 那么它与 CMake 有什么关系?
-
此外,似乎已经配置了链接(解决方案资源管理器中的参考节点)。所以基本上你想为你的项目调整包含路径,对吧?
-
@Bernd 感谢您指出这一点,我确实在寻找纯 VS 解决方案。我现在删除了 cmake 标签。至于其他问题,是的 - 包括路径。
-
我不相信 VS 有任何这样的选择。此外,包含所有 A 的包含是不正确的。一般来说,A 可能包含一些完全不需要的包含 B。我管理它相当简单。我从不写
#include "B.hpp",而是#include "B/B.hpp",所以项目需要包含但所有项目所在的文件夹。或者如果你有多个项目所在的文件夹,你甚至可以像#include "SolName/B/B.hpp"这样写,所以整个包括只是整个解决方案的一个文件夹(除了第三方包括...) -
通常的100% UI方式是定义#include你想要的方式,即:“a\a.hpp”或“a.hpp”等,然后“play”引用项目属性“配置属性”/“VC++ 目录”/“包含目录”并添加相对路径,即:“..”或“..\a”或其他任何内容。这样,您永远不会更改源代码,但可以创建无限变化的项目。否则你可以使用 MSBuild 的 .csproj 来做更强大的事情。
标签: c++ visual-studio visual-c++ visual-studio-2019