我有一个跨语言(C ++< - > FORTRAN)循环依赖,根除是太麻烦,所以我忍受它。它只需要偶尔的/ FORCE,我的C ++库没有链接器依赖。我已根据需要手动执行此操作,但我们的产品的新版本有八种配置(未来可能会更多),而且它变得更加痛苦。
我可以为Visual Studio配置管理器中的每个构建创建“强制”配置,或者为项目创建“强制”副本。但是,这两种方法都有点令人头疼 - 项目的更改必须扩展到所有配置/项目副本。
有人能想到一种快速构建我的“强制”配置的方法,而不必为了这个目的而设置触发器或保持同步配置吗?
答案 0 :(得分:1)
正如评论中所提到的,如果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命名)。 p>
[注意,使用这种方法,导入库实际上并不依赖于编译Fortran源文件时生成的目标代码 - 使用静态库项目的自定义构建步骤只是一种方便。如果您还没有Fortran DLL的模块定义文件,则另一种方法是在自定义构建步骤中在库管理程序的调用中提供单个目标文件,并让库管理器确定来自任何指令的导出。源文件。但是,我更喜欢在源指令中使用模块定义文件。]
创建一个包含所有C ++源代码并构建C ++ DLL的C ++项目。该项目应该依赖于Fortran静态库项目,并链接到Fortran静态库项目生成的导入库。
创建一个Fortran DLL项目,其基本名称与Fortran DLL相同,它包含一个虚拟Fortran源文件,其中只有注释(这只是为了避免构建系统混淆)。此DLL项目应该依赖于C ++ DLL项目,并链接到C ++项目生成的导入库。在项目属性中,在Linker>下输入>其他依赖项,也添加到静态库(不是导入库!)和Fortran静态库项目生成的导出文件。
Fortran DLL的其他直接客户端应该链接到Fortran静态库项目的自定义构建步骤生成的导入库。
这种方法的变化是可能的。