MSBuild C++链接时依赖项

Sea*_*tch 6 msbuild linker visual-studio

在以下场景中,我想使用MSBuild增加构建的并行性:

有三个C++项目(目标).第一个是调用的静态库A,第二个是B依赖的动态库A,第三个是C依赖的可执行文件B.所有项目都包含简单的源代码,没有标题生成或其他恶作剧.

此配置中没有任何内容可以阻止所有转换单元并行编译,因为唯一的实际依赖关系是在链接时.但是,在MSBuild中设置引用和依赖关系的标准方法强制所有A构建之前甚至开始构建任何内容B,依此类推.这不必要地序列化了一些构建过程.

项目和通用解决方案需要对"普通"开发人员保持平易,这意味着维护项目和构建设置应该完全可以在Visual Studio UI中实现(新库和可执行文件可能依赖于预先存在的属性表,但不应该要求手动编辑新项目的.vcxproj文件,也不手动编写MSBuild XML文件.

我目前的想法是将所有代码从B和移动C到单独的静态库中,称为B'C'.然后B将取决于两者,AB'允许它们并行编译.同样地,由于C最终取决于A,B'C'那些可以并行所有编译.正如预期的那样,唯一剩下的串行进程就是链接器步骤.虽然它不是世界末日,但这比我想要的更麻烦和非惯用.

我真的希望能够为项目的链接步骤创建依赖项,这些项目的链接步骤也不会作为项目编译步骤的依赖项.在大多数其他构建系统中,我熟悉这一点,如果不是隐含的话,这是微不足道的.鉴于Visual Studio的易用性要求,是否可以在MSBuild for C++项目中使用; 如果是这样,怎么样?

C J*_*son 1

最简单的方法是将您的三个项目放入 Visual Studio 解决方案文件(即 *.sln)中。我知道它很丑陋,并且解决方案文件不是真正的 msbuild 文件。为了使其工作,您还必须使用 Visual Studio 工具指定项目依赖项。(即右键单击解决方案,选择“项目依赖项...”)

完成此操作后,在 Visual Studio 内部,它应该对所有项目并行执行编译步骤,然后以正确的顺序链接它们。

在命令行上,要达到相同的效果,您必须将 -m 传递给 msbuild.exe 以及解决方案文件的名称。

这还假设您也在所有项目文件中指定了 -MP。