FortranC接口¶
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 符号:
没有“_”的全局符号:
调用 mysub()带有“_”的全局符号:
call my_sub()不带“_”的模块符号:
使用 mymod;调用 mysub()带有“_”的模块符号:
use mymod;调用 my_sub()
如果未知类别的重整,则其宏未定义。所有宏都需要小写和大写的原始名称。
选项是:
MACRO_NAMESPACE将默认的“FortranCInterface”前缀替换为给定的命名空间“<macro-ns>”。
符号列出要使用 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”(或“FortranCInterface_VERIFIED_CXX”,如果给定“CXX”)中。如果检查失败并且未给出“QUIET”,则该函数将终止并显示一条描述问题的致命错误消息。此检查的目的是针对不兼容的编译器组合提前停止构建。测试建立在“发布”配置中。
用法示例¶
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 manglings,但它也提供了一个接口来指定新的可能的 manglings。设置变量
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 manglings。 (为了清晰起见,插入符号指向原始符号名称,但不是必需的。)