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
以指定符號 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
名稱修飾。(插入符號在此範例中指向原始符號名稱以求清晰,但並非必要。)