首页 > 解决方案 > Visual Studio 2019:传递包含链引用项目之间的路径

问题描述

假设我们有一个现有的 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 的“基于目标”的方法,我天真地认为我可以处理以下情况:

然而,在这种情况下,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中实现这一点?

[1]:https://i.stack.imgur.com/CAMws.png

标签: c++visual-studiovisual-c++visual-studio-2019

解决方案


您可以通过右键单击项目、属性、“C++ 目录”来手动配置包含路径 在此处输入图像描述

这可行,但性能不是很好/不是那么好。您也可以通过 MSBuild 配置它,例如使用共享的 props 文件。但我也不喜欢这种方法。

在我看来,这样做的最佳选择,不仅适用于多个部分(exe,dlls...) - 也适用于交叉编译 - 是使用具有共享元素的共享库/项目。

这使您可以将所有接口文件放在那里。我更进一步——我的项目不包含代码——它完全存储在共享项目中。通过此设置,您可以创建例如使用 MSVC 的 Windows 项目和使用相同代码库使用 GCC 编译的 Linux 版本。或者创建一个静态或动态库 - 没有什么是固定的。

要使用共享项目中的代码,您可以简单地将其添加为参考(就像您对其他项目所做的那样) - 非常简单。如果您需要进一步的帮助 - 请询问。

在这里您可以在 github 上找到一个示例:https ://github.com/bernd5/Stackoverflow-VS-Sample

寻求帮助一些图片(我的 VS 是德语 - 但我希望你能使用它):

创建共享项目 项目浏览器


如果您不喜欢共享库方法,您可以在此处找到不带“..”的替代方法:首先,您需要将每个项目的 include-directories 属性调整为:( 与解决方案目录 添加 MSBuild-Variable SolutionDir

然后你可以简单地写:

#include "A/A.h"

推荐阅读