Visual-Studio:高效处理循环库依赖

Visual-Studio: Efficiently Dealing With Cyclic Library Dependency

本文关键字:依赖 循环 处理 高效 Visual-Studio      更新时间:2023-10-16

我有一个跨语言(C++ <-> FORTRAN)循环依赖,很难根除,所以我忍受它。它只需要偶尔的/FORCE,对我的C++库没有链接器依赖项。我一直在根据需要手动执行此操作,但是我们产品的新版本有八种配置(将来可能会更多),并且变得越来越痛苦。

我可以在Visual Studio配置管理器中为每个生成创建"强制"配置,或者为我的项目创建"强制"副本。但是,这两种方法都有点令人头疼的维护问题 - 对项目的更改必须扩展到所有配置/项目副本。

谁能想到一种方法来快速构建我的"强制"配置,而不必为此目的进行触发器设置或维护同步配置?

如注释中所述,如果 DLL 紧密耦合,则将它们合并到单个 DLL 中可能更有意义。

但是,如果仍然需要两个 DLL,则一种解决方案是将当前生成 DLL 的项目之一拆分为两个 - 一个静态库项目,该项目还从模块定义文件生成导入库和导出文件,另一个项目生成 DLL。

然后,这两个项目将结束另一个 DLL 的构造。

例如,选择拆分Fortran DLL,因为我更熟悉其项目系统:

  • 创建一个模块定义文件,其基本名称与将用于 Fortran DLL 的名称相同,该文件在其导出部分中列出 Fortran DLL 将导出的所有符号。

  • 创建一个名称与最终 Fortran DLL 不同的 Fortran 静态库项目,该项目配置为编译所有 Fortran 源代码。 在项目属性中,作为自定义生成步骤,按照lib /DEF:xxx.def /OUT:xxx.dll /MACHINE:x86行添加对库管理员的额外调用(其中 xxx 是将用于 Fortran DLL 的基本名称 - 根据需要将配置名称作为路径后缀,根据需要更改计算机选项)。 构建此 Fortran 静态库项目现在将生成两个库 - 一个包含目标代码(以项目命名),另一个是导入库(以 DLL 命名)和一个导出文件(也以 DLL 命名)。

[请注意,使用这种方法,导入库实际上并不依赖于编译 Fortran 源文件时生成的目标代码 - 使用静态库项目的自定义构建步骤只是一种方便。 如果还没有 Fortran DLL 的模块定义文件,另一种方法是在自定义生成步骤中调用库管理员时提供单个对象文件,并让库管理员确定源文件中任何指令的导出。 但是,我更喜欢模块定义文件而不是源指令。

  • 创建一个保存所有C++源并生成C++ DLL 的C++项目。 该项目应依赖于 Fortran 静态库项目,并链接到由 Fortran 静态库项目生成的导入库。

  • 创建一个与Fortran DLL具有相同基本名称的Fortran DLL项目,该项目包含一个虚拟的Fortran源文件,其中只有注释(这只是为了避免构建系统混淆)。 此 DLL 项目应依赖于C++ DLL 项目,并链接到C++项目生成的导入库。 在项目属性中,在"链接器>输入>其他依赖项"下,还添加静态库(而不是导入库!)并导出 Fortran 静态库项目生成的文件。

Fortran

DLL 的其他直接客户端应链接到由 Fortran 静态库项目的自定义生成步骤生成的导入库。

这种方法的变体是可能的。