2015-05-19 247 views
3

我正在嘗試編寫一個C封裝程序來調用Fortran模塊中的一組函數。我從一些基本的東西開始,但我錯過了一些重要的東西。C封裝程序調用Fortran函數

我試着追加/預先設置不同數目的下劃線。我也嘗試用gcc而不是gfortran鏈接。我在下面顯示的是最簡單的錯誤。

我正在運行Yosemite 10.10.3,GNU Fortran 5.1.0的Mac和Xcode附帶的C編譯器。

的main.c

#include "stdio.h" 

int main(void) 
{ 
    int a; 
    float b; 
    char c[30]; 
    extern int _change_integer(int *a); 

    printf("Please input an integer: "); 
    scanf("%d", &a); 

    printf("You new integer is: %d\n", _change_integer(&a)); 

    return 0; 
} 

intrealstring.f90

module intrealstring 
use iso_c_binding 
implicit none 

contains 

integer function change_integer(n) 
    implicit none 

    integer, intent(in) :: n 
    integer, parameter :: power = 2 

    change_integer = n ** power 
end function change_integer 

end module intrealstring 

這裏是我如何編譯,與錯誤一起:

$ gcc -c main.c 
$ gfortran -c intrealstring.f90 
$ gfortran main.o intrealstring.o -o cwrapper 
Undefined symbols for architecture x86_64: 
    "__change_integer", referenced from: 
     _main in main.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
$ 
+1

錯誤建議你的混合32位和64位代碼? – cjb110

+0

請務必使用標籤[tag:fortran],僅在您想要強調不需要任何更新的標準版本時才爲各個版本使用標籤。 –

回答

3

你必須綁定FORTRAN到C:

module intrealstring 
use iso_c_binding 
implicit none 

contains 

integer (C_INT) function change_integer(n) bind(c) 
    implicit none 

    integer (C_INT), intent(in) :: n 
    integer (C_INT), parameter :: power = 2 

    change_integer = n ** power 
end function change_integer 

end module intrealstring 

你的C文件,以作如下修改:

#include "stdio.h" 

int change_integer(int *n); 

int main(void) 
{ 
    int a; 
    float b; 
    char c[30]; 

    printf("Please input an integer: "); 
    scanf("%d", &a); 

    printf("You new integer is: %d\n", change_integer(&a)); 

    return 0; 
} 

的你可以這樣做:

$ gcc -c main.c 
$ gfortran -c intrealstring.f90 
$ gfortran main.o intrealstring.o -o cwrapper 
+0

也許不是,C_INT更好。我編輯 – LPs

+0

謝謝弗拉基米爾。你的解決方案有效在Fortran函數change_integer中,參數「power」是本地的。對C的綁定仍然是必要的,還是將所有聲明綁定到C都是一種很好的編程習慣? – leoleson

+0

我想你是在問我你的問題。是的,你可以避免綁定權力變量,因爲是本地的。我在編寫包裝時總是使用綁定。避免在必須的地方忘記綁定是個人規則。請將答案設爲正確,以避免其他人浪費時間。 – LPs