FortranCInterface¶
Fortran/C 介面偵測
此模組會自動偵測 C 和 Fortran 語言互動的 API。
模組變數¶
指示是否找到名稱修飾 (mangling) 的變數
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
修飾。(為清楚起見,在此範例中,插入符號指向原始符號名稱,但不需要。)