![](/img/trans.png)
[英]Template an extern “C” function to call Fortran functions from C++ with different types
[英]Using Fortran to call C++ Functions
我正在嘗試使用一些FORTRAN代碼來調用我編寫的幾個c ++函數(c_tabs_就是其中之一)。 鏈接和一切工作正常,只要我調用不屬於類的函數。
我的問題是我希望FORTRAN代碼調用的函數屬於一個類。 我使用nm查看符號表,函數名稱就像這樣丑陋:
00000000 T _ZN9Interface7c_tabs_Ev
FORTRAN不允許我用這個名字來調用函數,因為開頭有下划線,所以我很茫然。
當c_tabs不在類中時,它的符號非常簡單,FORTRAN沒有問題:
00000030 T c_tabs_
有什么建議么? 提前致謝。
這個名稱已被破壞,這是C ++編譯器所做的功能,允許函數重載和類型安全鏈接等功能。 坦率地說,你極不可能從FORTRAN調用成員函數(因為FORTRAN不能創建C ++類實例,除其他原因外) - 你應該用C API來表達你的接口,它可以從幾乎任何地方調用。
您將需要創建一個c風格的界面和“extern”它。 C ++破壞了用於鏈接的方法名稱(和重載函數)。 將C ++與C ++之外的任何東西聯系起來都是非常困難的。 有“方法”,但我強烈建議您只需導出C接口並使用Fortran中提供的標准工具。
你必須創建extern "C"
包裝器來處理FORTRAN調用C ++的所有細節,名稱修改是最明顯的。
class foo {
public:
int a_method (int x);
}
extern "C" int foo_a (foo * pfoo, int * px) {
if (NULL == pfoo)
return 0;
else
return pfoo->a_method (*px);
}
請注意,FORTRAN編譯器通過引用傳遞所有參數,而不是通過值傳遞。 (雖然我被告知這不是嚴格意義上的FORTRAN標准的一部分。)
如果你使C ++例程具有C風格的接口(如已經描述的那樣),那么你可以使用Fortran 2003的ISO C Binding功能來調用它。 使用ISO C Binding,您可以指定例程的名稱和(在限制范圍內)參數和函數返回的C類型和調用約定(引用,按值)。 這種方法運行良好,並且具有標准的優點,因此與編譯器和平台相關,不像從Fortran調用C的舊方法。 許多Fortran 95編譯器支持ISO C綁定,例如gfortran> = 4.3。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.