Visual Studio Solution Dependencies

Visual Studio Solution Dependencies

本文关键字:Dependencies Solution Studio Visual      更新时间:2023-10-16

我在一个拥有基于数百个Visual Studio解决方案(主要是C++)的产品套件的组织工作。其中一些解决方案生成供其他解决方案使用的库,还有一个通用的"include"文件夹,其中包含由多个模块共享的标头。

问题是依赖项没有在任何地方明确说明,并且构建系统通过指定线性构建顺序来解决依赖项,以确保在正确的时间生成依赖模块。这适用于构建系统,但在尝试处理具有许多直接和间接外部依赖项的组件时,开发人员处于劣势。例如,我可能想要编辑其中一个库项目或共享标头,然后构建所有受影响的模块,而不一定事先知道哪些模块受到影响。另一个用例涉及在从 TFS 执行全新拉取后构建模块,并首先构建它所依赖的模块,而无需构建整个系统。

我想知道是否有任何工具可以自动生成依赖项以构建大型项目。我考虑过创建一些非常大的解决方案来封装其他解决方案,但这似乎真的很尴尬和笨拙。另外,我不喜欢让开发人员手动指定依赖项的想法,因为它容易出错,尤其是在如此大的代码库下。几年前我使用 scons 并且非常喜欢它解析源文件并自动发现所有依赖项依赖项的方式。今天有什么东西可以用Visual Studio解决方案做同样的事情吗?

这不是Visual Studio的副本:如何处理项目依赖项?

我需要强调我试图解决的问题的严重性。这是一个非常大的现有代码库。在主目录中有数百个子文件夹,每个子文件夹都包含一个或多个 VS 解决方案(不是项目)。每个解决方案又包含一个或多个项目。正如我之前所说,我不会尝试在解决方案中的几个项目之间建立依赖关系。问题远不止于此。我正在尝试找到一种方法来建立解决方案本身(数百个)之间的依赖关系。例如,一个解决方案可能包含一些项目,这些项目生成用于安全性的库,其他项目用于通信等。例如,可能有数十种使用通信库的解决方案。所以从本质上讲,我正在尝试创建一个有数百个节点和可能数万个边的有向循环图。

你可以使用cmake(https://cmake.org/)。使用它,您可以指定要构建的多个库和应用程序。配置完成后,您可以修改项目,构建将仅更新依赖项目。Cmake还提供了Visual Studio生成器,以便您可以继续使用该IDE。

一个可能的缺点是,要进行配置,您必须为每个项目(库或可执行文件)明确指定它必须与哪些项目链接以及它必须包含哪些文件夹。有一些方法可以定义一些全局包含和链接,但使用将取决于您的问题。

VS确实跟踪依赖关系(通过解析源文件)。某些东西可以自动设置 VS 项目的依赖项是没有意义的,在任何其他构建工具中,您仍然必须以某种方式指定链接项目A.exe需要使用B.lib.

如果您使用较新的 VS 版本,您应该简单地将 lib 的引用添加到您的 exe/dll 项目中。如果您手动添加了项目依赖项,则很可能应该将它们全部删除,尤其是确保不要使静态库项目相互依赖。VS 允许您这样做(例如,如果一个库的构建生成了另一个静态库使用的一些源文件),但通常这些不应该有任何依赖项,这允许 VS 通过并行构建来优化构建。

例如,通常你可以有某种Base.lib,然后是System.lib和Graphics.lib。所有这些都是你的应用的用户.exe。System.lib使用来自Base.lib的代码,Graphics.lib使用来自System.lib和Base.lib的代码。所以,依赖链自然是明确的,你去在VS中设置它们,这是一个错误!在 VS 中这样的情况下,您应该使这 4 个库独立,并且只有 App.exe 应该依赖于所有这些库(例如,它应该引用所有这些库)。VS 将找出这些项目的正确依赖关系。

关于 Cmake 案例:它只是生成 VS 项目和解决方案,如果您使用 VS,那么 cmake 不能比 VS 本身做得更多。