如何使用msbuild从OBJS生成导入LIB
How to generate import LIBs from OBJS using msbuild
我正在将一个古老的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时(,因为我没有做链接。
- 尝试导入pybind-opencv模块时出现libgtk错误
- 导入库可以跨dll版本工作吗
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- JSON转换为nlohmann JSON-lib中的结构数组
- 建议在运行时将带有类实例的列表从c++导入qml
- 导入/导出变量时出错
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 将QT项目导入Visual Studio 2019会给我带来很多LNK2001错误
- 是否可以将函数导入命名空间,但不能导出它?
- 如何将 CLion C++ 项目导入 Visual Studio?
- Python 3.8 不能与 Pybind11 一起导入 [Windows]
- 无法将标准库导入本机 android 项目中的头文件
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 为什么我的链接器在找到Coin4d.lib后搜索Coin4sd.lib?
- 在 python 模块中导入子模块时PyImport_Import失败
- libcpmtd.lib有什么用?
- 链接器找不到导入的 DLL 的 LIB 文件
- 如何使用msbuild从OBJS生成导入LIB
- 如何检查 LIB 导入库是否完全匹配其 DLL