0

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

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

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

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

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

4

2 回答 2

0

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

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

于 2017-05-18T20:34:35.927 回答
0

VS 确实跟踪依赖项(通过解析源文件)。在任何其他构建工具中,您仍然必须以某种方式指定链接项目A.exe需要使用B.lib.

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

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

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

于 2017-05-18T20:46:40.660 回答