FortranCInterface¶
Fortran/C 接口检测
此模块会自动检测 C 和 Fortran 语言交互的 API。
模块变量¶
指示是否找到重载的变量
FortranCInterface_GLOBAL_FOUND
全局子程序和函数。
FortranCInterface_MODULE_FOUND
模块子程序和函数(由“MODULE PROCEDURE”声明)。
此模块还提供以下变量来指定已检测到的重载,但通常使用无需引用它们,并且可以使用以下 模块函数。
FortranCInterface_GLOBAL_PREFIX
没有下划线的全局符号的前缀。
FortranCInterface_GLOBAL_SUFFIX
没有下划线的全局符号的后缀。
FortranCInterface_GLOBAL_CASE
没有下划线的全局符号的情况,为
UPPER
或LOWER
。FortranCInterface_GLOBAL__PREFIX
带下划线的全局符号的前缀。
FortranCInterface_GLOBAL__SUFFIX
带下划线的全局符号的后缀。
FortranCInterface_GLOBAL__CASE
带下划线的全局符号的情况,为
UPPER
或LOWER
。FortranCInterface_MODULE_PREFIX
没有下划线的模块符号的前缀。
FortranCInterface_MODULE_MIDDLE
没有下划线的模块符号的中部,出现在模块名称和符号名称之间。
FortranCInterface_MODULE_SUFFIX
没有下划线的模块符号的后缀。
FortranCInterface_MODULE_CASE
没有下划线的模块符号的情况,为
UPPER
或LOWER
。FortranCInterface_MODULE__PREFIX
带下划线的模块符号的前缀。
FortranCInterface_MODULE__MIDDLE
带下划线的模块符号的中部,出现在模块名称和符号名称之间。
FortranCInterface_MODULE__SUFFIX
带下划线的模块符号的后缀。
FortranCInterface_MODULE__CASE
带下划线的模块符号的情况,为
UPPER
或LOWER
。
模块函数¶
- 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_mysub
和 FC_mymod_my_sub
。
其他混淆¶
FortranCInterface 了解多种 Fortran 编译器可能的 GLOBAL
和 MODULE
混淆,但也提供了一个接口来指定可能的混淆。设置变量
FortranCInterface_GLOBAL_SYMBOLS
FortranCInterface_MODULE_SYMBOLS
在包含 FortranCInterface 指定符号 MySub
、My_Sub
、MyModule:MySub
和 My_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 尝试给定的 GLOBAL
和 MODULE
异常。(为了在此示例中清楚起见,插入符号指向原始符号名称,但并不是必需的。)