gpt4 book ai didi

c++ - 在混合 Fortran/C++ 解决方案中能否安全地忽略 LNK4006 警告?

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

我们当前的解决方案是 Visual Studio 2013 中的混合 C++ Fortran 应用程序,每个应用程序大约有 40 个项目。

虽然我们可以很好地构建解决方案,但我们收到了大约 6000 条警告 - 其中绝大多数是 LNK4006 警告,其中函数正在“重复”:

warning LNK4006: _XXXXXXXXXXX@8 already defined in project1.lib(module1.obj); second definition ignored project2.lib(module1.obj)   

共同点是被复制的函数是在 Fortran 模块中定义的——其中许多只是 C++ 函数的接口(interface):

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 项目中使用,每个项目都有一个独立版本的接口(interface)函数 - 因此存在重复。

这一切都非常合理,但我的问题是:我可以忽略警告(即在项目配置中排除它们)吗?我看不到任何明显的方法来重构我们的代码以删除警告,我的印象是将这些接口(interface)放在一个模块中是一种很好的做法...

最佳答案

感谢所有在此主题中提出建设性意见的人 - 还要感谢@IanH 和 Steve Lionel,他们在英特尔论坛主题中提供了帮助 https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/628995 .

简而言之

(这是我自己的判断,没有其他人的判断)在这种特殊情况下,警告多余的,但是如果您禁用它们,您将错过任何可能很重要的新警告。恕我直言,这意味着您不应禁用该警告。

长答案

警告来自两个来源:

  1. 已经形成了一种惯例,即使用模块来包含“全局”数据,但要通过与模块在同一文件中定义的“访问函数”来访问它。这意味着当模块包含在许多不同的项目中时,访问器函数会被编译多次。
  2. 这些模块中有几个包含 C 接口(interface) block (这是一个很好的做法),但是对于返回字符串的函数,使用了 Creating a FORTRAN interface to a C function that returns a char* 中描述的范例。 .尽管接口(interface) block 本身没有引发重复警告,但将 C 指针转换为 Fortran 字符串的辅助函数却引发了重复警告。

一个解决方案可能是将所有这些访问器函数和辅助接口(interface)例程提取到单独的文件中,并且只编译一次,但这将花费数周时间。

感谢@IanH,他指出您可以通过在单独的项目中定义所有模块来避免这种情况,然后(在 Visual Studio 中)将所有项目设置为依赖于这个新的“共享模块”项目(使用 Build Dependencies-->Project Dependencies)。现在编译时没有警告; VS 的“完整解决方案”搜索现在只找到每个例程一次;它可能编译得更快!总而言之,胜利。

关于c++ - 在混合 Fortran/C++ 解决方案中能否安全地忽略 LNK4006 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36918026/

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