FortranCInterface

Fortran/C 接口检测

此模块会自动检测 C 和 Fortran 语言交互的 API。

模块变量

指示是否找到重载的变量

FortranCInterface_GLOBAL_FOUND

全局子程序和函数。

FortranCInterface_MODULE_FOUND

模块子程序和函数(由“MODULE PROCEDURE”声明)。

此模块还提供以下变量来指定已检测到的重载,但通常使用无需引用它们,并且可以使用以下 模块函数

FortranCInterface_GLOBAL_PREFIX

没有下划线的全局符号的前缀。

FortranCInterface_GLOBAL_SUFFIX

没有下划线的全局符号的后缀。

FortranCInterface_GLOBAL_CASE

没有下划线的全局符号的情况,为 UPPERLOWER

FortranCInterface_GLOBAL__PREFIX

带下划线的全局符号的前缀。

FortranCInterface_GLOBAL__SUFFIX

带下划线的全局符号的后缀。

FortranCInterface_GLOBAL__CASE

带下划线的全局符号的情况,为 UPPERLOWER

FortranCInterface_MODULE_PREFIX

没有下划线的模块符号的前缀。

FortranCInterface_MODULE_MIDDLE

没有下划线的模块符号的中部,出现在模块名称和符号名称之间。

FortranCInterface_MODULE_SUFFIX

没有下划线的模块符号的后缀。

FortranCInterface_MODULE_CASE

没有下划线的模块符号的情况,为 UPPERLOWER

FortranCInterface_MODULE__PREFIX

带下划线的模块符号的前缀。

FortranCInterface_MODULE__MIDDLE

带下划线的模块符号的中部,出现在模块名称和符号名称之间。

FortranCInterface_MODULE__SUFFIX

带下划线的模块符号的后缀。

FortranCInterface_MODULE__CASE

带下划线的模块符号的情况,为 UPPERLOWER

模块函数

FortranCInterface_HEADER

FortranCInterface_HEADER 函数用于生成包含用作宏定义的 C 头文件,以重载符号名称

FortranCInterface_HEADER(<file>
                         [MACRO_NAMESPACE <macro-ns>]
                         [SYMBOL_NAMESPACE <ns>]
                         [SYMBOLS [<module>:]<function> ...])

它在 <file> 中生成以下宏定义

#define FortranCInterface_GLOBAL (name,NAME) ...
#define FortranCInterface_GLOBAL_(name,NAME) ...
#define FortranCInterface_MODULE (mod,name, MOD,NAME) ...
#define FortranCInterface_MODULE_(mod,name, MOD,NAME) ...

这些宏分别重载四种 Fortran 符号类别

  • 没有 '_' 的全局符号:call mysub()

  • 带 '_' 的全局符号:call my_sub()

  • 不包含 '_': 的模块符号:use mymod; call mysub()

  • 包含 '_' 的模块符号:use mymod; call my_sub()

如果不知道某类别的混淆,则其宏将保持未定义状态。所有宏均需要小写和大写的原始名称。

选项是

MACRO_NAMESPACE

将默认 FortranCInterface_ 前缀替换为给定的命名空间 <macro-ns>

SYMBOLS

列出使用 C 预处理器定义自动混淆的符号

<function>          ==> #define <ns><function> ...
<module>:<function> ==> #define <ns><module>_<function> ...

如果不知道某个符号的混淆,则不会创建预处理器定义,并且会显示警告。

SYMBOL_NAMESPACE

使用给定的命名空间 <ns>SYMBOLS 选项生成的所有预处理器定义添加前缀。

FortranCInterface_VERIFY

提供 FortranCInterface_VERIFY 函数来验证 Fortran 编译器和 C/C++ 编译器能够协同工作

FortranCInterface_VERIFY([CXX] [QUIET])

它测试是否可以使用 Fortran 和 C(以及给出了 CXX 选项时可以使用 C++)成功编译和链接简单的测试可执行文件。结果存储在高速缓存条目 FortranCInterface_VERIFIED_C(或如果给出了 CXX,则存储在 FortranCInterface_VERIFIED_CXX 中)作为布尔值。如果检查失败,并且没有给出 QUIET,则该函数将终止并显示描述该问题的致命错误消息。此检查的目的是在遇到不兼容的编译器组合时尽早停止生成。测试是在 Release 配置中进行的。

示例用法

include(FortranCInterface)
FortranCInterface_HEADER(FC.h MACRO_NAMESPACE "FC_")

这将创建一个 "FC.h" 头,该头定义混淆宏 FC_GLOBAL()FC_GLOBAL_()FC_MODULE()FC_MODULE_()

include(FortranCInterface)
FortranCInterface_HEADER(FCMangle.h
                         MACRO_NAMESPACE "FC_"
                         SYMBOL_NAMESPACE "FC_"
                         SYMBOLS mysub mymod:my_sub)

这将创建一个 "FCMangle.h" 头,该头定义与前一个示例相同的 FC_*() 混淆宏以及预处理器符号 FC_mysubFC_mymod_my_sub

其他混淆

FortranCInterface 了解多种 Fortran 编译器可能的 GLOBALMODULE 混淆,但也提供了一个接口来指定可能的混淆。设置变量

FortranCInterface_GLOBAL_SYMBOLS
FortranCInterface_MODULE_SYMBOLS

在包含 FortranCInterface 指定符号 MySubMy_SubMyModule:MySubMy_Module:My_Sub 的异常前。例如,代码

set(FortranCInterface_GLOBAL_SYMBOLS mysub_ my_sub__ MYSUB_)
  #                                  ^^^^^  ^^^^^^   ^^^^^
set(FortranCInterface_MODULE_SYMBOLS
    __mymodule_MOD_mysub __my_module_MOD_my_sub)
  #   ^^^^^^^^     ^^^^^   ^^^^^^^^^     ^^^^^^
include(FortranCInterface)

指示 FortranCInterface 尝试给定的 GLOBALMODULE 异常。(为了在此示例中清楚起见,插入符号指向原始符号名称,但并不是必需的。)