调用Fortran函数的C包装器



我试图写一个C包装器调用Fortran模块中的一组函数。我从一些基本的东西开始,但我遗漏了一些重要的东西。

我已经尝试追加/追加不同数量的下划线。我也试过用gcc而不是gfortran链接。下面给出的是最简单的错误。

我在Mac上工作,运行Yosemite 10.10.3, GNU Fortran 5.1.0,以及Xcode附带的C编译器。

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: %dn", _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
$ 

必须将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: %dn", change_integer(&a));
    return 0;
}

你可以这样做:

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

相关内容

  • 没有找到相关文章

最新更新