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_ORDER
- 在 4.1 版本中新增。 - 不带下划线的模块符号组件顺序 - MODULE_THEN_SYMBOL
- 模块名称出现在符号名称*之前*,即 - <PREFIX><module><MIDDLE><symbol><SUFFIX>。
- SYMBOL_THEN_MODULE
- 模块名称出现在符号名称*之后*,即 - <PREFIX><symbol><MIDDLE><module><SUFFIX>。
 
- FortranCInterface_MODULE__PREFIX
- 带下划线的模块符号前缀。 
- FortranCInterface_MODULE__MIDDLE
- 带下划线的模块符号中间部分,出现在模块名称和符号名称之间。 
- FortranCInterface_MODULE__SUFFIX
- 带下划线的模块符号后缀。 
- FortranCInterface_MODULE__CASE
- 带下划线的模块符号的大小写, - UPPER或- LOWER。
- FortranCInterface_MODULE__ORDER
- 在 4.1 版本中新增。 - 带下划线的模块符号组件顺序 - MODULE_THEN_SYMBOL
- 模块名称出现在符号名称*之前*,即 - <PREFIX><module><MIDDLE><symbol><SUFFIX>。
- SYMBOL_THEN_MODULE
- 模块名称出现在符号名称*之后*,即 - <PREFIX><symbol><MIDDLE><module><SUFFIX>。
 
模块函数¶
- 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
以指定符号 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 修饰。(在此示例中,插入符号指向原始符号名称以进行清晰度说明,但并非必需。)
