如何使用msbuild从OBJS生成导入LIB

How to generate import LIBs from OBJS using msbuild

本文关键字:导入 LIB OBJS 何使用 msbuild      更新时间:2023-10-16

我正在将一个古老的C/C++构建系统从VC98转换为VS2017。我们使用了自己的自定义makefile,但现在我想使用标准的VS2017项目从命令行进行自动构建。引入代码不是问题。问题是我们旧的构建系统,以及我们以前如何构建以解决循环依赖关系(CD(不要让我开始删除这些循环依赖项。:-(我知道它们很坏,但把它们移走将是一项艰巨的任务

我们有两个主要步骤:生成shared_lib和生成all。make shared_lib会将代码编译到静态库或导入库(取决于文件夹的makefile(中,并将库复制到共享的lib文件夹中。make-all将构建任何二进制文件(DLL/EXE(并放置在一个通用的BIN文件夹中。要进行完整的构建,我们将转到50多个文件夹中的每个文件夹,并在每个文件夹中创建shared_lib。然后我们会把所有的东西都放在每个文件夹里。示例:

  • 文件夹A生成导入库A.lib和A.dll,后者需要导入库B.lib
  • 文件夹B生成导入库B.lib和B.dll,后者需要导入库A.lib
  • 我们在A中生成shared_lib,并从OBJ生成导入lib A.lib。我们还不需要B.libA.lib
  • 我们在B中生成shared_lib并生成导入lib B.lib
  • make all in A生成A.dll并运行b/c我们在上一步中有b.lib
  • make all in B生成B.dll

我想这可以在VS2017项目文件中完成,但我想知道有多容易。。。我可以将预链接构建事件放入文件夹a项目中,以生成导入库a.lib。但项目a的主要输出是a.dll,输出类型的唯一选项(我看到的(是dll。但是,我无法完成链接A.dll b/c我还没有b.lib。

我创建了一个包含all和shared_lib目标的项目。然后这些目标使用LINK和LIB msbuild任务。如果只是这样,也不会太糟。但我也需要将这些文件编译成OBJ。那就是我遇到麻烦的地方。当然,我使用CL任务,但我必须指定大量选项。我指定了输入和输出,它基本上起作用。如果我修改一个CPP文件,只会重建该文件,然后它会生成LIB,然后生成DLL——这就是我想要的。但问题是,如果我更改了这个CPP文件所依赖的.H文件,该怎么办?它不知道如何重新生成CPP文件。这可能是我可以指定给CL的另一个选项,但它已经失控了。。。

所以,归根结底就是:在我的测试项目中,我完全控制了构建过程。我不想要这个负担。我想让msbuild/VS2017来确定哪些文件需要重建。我想做一个"msbuild foo.sln/t:shared_lib",让msbuild完成所有繁重的工作。

我可能可以在不同的项目中做到这一点,但这听起来效率低下,更难自动化。我可以手工制作一个项目文件,但我仍然希望msbuild能够控制(而不是我(。

所以,以下是我所做的。。。我使用$(GenerateImportLib(选项创建了A.vcxproj。作为构建的一部分,它构建了A.lib,但当然无法生成A.dll b/c。我缺少b.lib。因此,我将A.vcxproj复制到A_shared_lib.vcxproj(到另一个文件夹中(。然后,我调整了A_shared_lib.vcxproj来截取链接任务,如下所示:

<Target Name="Link">
<Message Text="Not doing a Link"/>
</Target>

因此,现在A_shared_lib.vcxproj只构建A.lib。配置类型仍然设置为"DynamicLibrary"。它不会产生错误(当它找不到B.lib时(,因为我没有做链接。