簡體   English   中英

使用Fortran調用C ++函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM