gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:31:03 25 4
gpt4 key购买 nike

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

我可以为 Visual Studio 配置管理器中的每个构建创建“强制”配置,或者为我的项目创建“强制”拷贝。然而,这两种方法都有点维护问题——对项目的更改必须传播到所有配置/项目拷贝。

有谁能想出一种方法来快速构建我的“强制”配置,而无需为此目的进行触发器设置或维护同步配置?

最佳答案

如评论中所述,如果 DLL 紧密耦合,则将它们组合成单个 DLL 可能更有意义。

但是,如果仍然需要两个 DLL,那么一种解决方案是将当前构建 DLL 的项目之一拆分为两个 - 一个静态库项目,该项目还构建一个导入库和一个来自模块定义的导出文件文件,以及构建 DLL 的第二个项目。

然后这两个项目结束了另一个 DLL 的构建。

例如选择拆分Fortran DLL,因为我比较熟悉它的项目系统:

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

  • 创建一个 Fortran 静态库项目,其名称与最终 Fortran DLL 的名称不同,该项目配置为编译所有 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++ 项目生成的导入库。在项目属性中,在 Linker > Input > Additional Dependencies 下,还添加静态库(不是导入库!)和 Fortran 静态库项目生成的导出文件。

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

此方法的变体是可能的。

关于c++ - Visual-Studio:高效处理循环库依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35710743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com