我们当前的解决方案是Visual Studio 2013中的混合C++ Fortran应用程序,每个应用程序大约有40个项目。混合的Fortran/C++解决方案中可以安全地忽略LNK4006警告吗?
虽然我们可以构建解决方案就好了,我们得到约6000警告 - 绝大多数这些都是LNK4006警告,其中一个功能被“复制”:
warning LNK4006: [email protected] already defined in project1.lib(module1.obj); second definition ignored project2.lib(module1.obj)
的共同点是,正在复制的功能在Fortran的模块中定义的 - 其中许多是只是接口到C++函数:
MODULE mINTERFACES
USE ISO_C_BINDING
INTERFACE
INTEGER(4) FUNCTION GetLastErrorCode [C, ALIAS: '_GetLastErrorCode'] (index)
USE ISO_C_BINDING
INTEGER(C_SIZE_T), INTENT(IN) :: index
END FUNCTION GetLastErrorCode
END INTERFACE
END
由于这些模块在许多的Fortran项目中使用的,每个项目具有接口功能的一个独立的版本 - H因为重复。
这一切都很合理,但我的问题是:我可以忽略警告(即在项目配置中排除它们)吗?我看不出任何明显的方式来重组我们的代码来删除警告,我的印象是,将这些接口放在一个模块中是很好的做法...
'[C,ALIAS:'_GetLastErrorCode']'是什么语法?你如何在C++中定义函数?你用'extern“C”'? –
这是针对C互操作性的Microsoft Powerstation扩展。语法的一个编译器,它已经死了二十年,按照Fortran 2003的ISO_C_BINDING的组合做我的头。 – IanH
Visual Studio中没有附带一个Fortran编译。您正在使用哪种特定的Fortran产品?这样一个接口块应该只能产生一个符号引用,而不是一个定义。从错误消息中,您看起来在多个库中具有相同的目标代码 - 即,您已经编译了两次或更多的module1.f90 - 是这种情况吗? – IanH