C 包装程序调用 Fortran 函数
C Wrapper Calling Fortran Functions
我正在尝试编写一个 C 包装器来调用 Fortran 模块中的一组函数。我从一些基本的东西开始,但我遗漏了一些重要的东西。
我试过 appending/prepending 不同数量的下划线。我也试过用 gcc 而不是 gfortran 链接。我在下面显示的是最简单的错误。
我正在开发 Mac 运行 Yosemite 10.10.3、GNU Fortran 5.1.0 和 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
$
您必须将 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
我正在尝试编写一个 C 包装器来调用 Fortran 模块中的一组函数。我从一些基本的东西开始,但我遗漏了一些重要的东西。
我试过 appending/prepending 不同数量的下划线。我也试过用 gcc 而不是 gfortran 链接。我在下面显示的是最简单的错误。
我正在开发 Mac 运行 Yosemite 10.10.3、GNU Fortran 5.1.0 和 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
$
您必须将 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