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 之前设置变量
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
名称修饰。(插入符号在本示例中指向原始符号名称是为了清晰起见,但不是必需的。)