#c #fortran #mixing
Вопрос:
У меня есть функция Fortran90
function eg_fun(r) bind(c)
use, intrinsic :: iso_c_binding
implicit none
real(c_double), intent(in) :: r
real(c_double) :: eg_fun
real(c_double), parameter :: PI = acos(-1.d0)
eg_fun = PI * r * r cos(r)
end function
и моя программа на языке Си
#include <stdio.h>
#include <math.h>
extern double eg_fun(double *r);
int main(int argc, char **argv){
double r;
printf("Enter the argumentn");
scanf("%lf", amp;r);
printf("The result is %lfn", eg_fun(amp;r));
return 0;
}
Я хочу использовать функцию Fortran в программе C с помощью инструмента iso_c_binding. Но когда я пытаюсь скомпилировать их с gcc -Wall main.c routine.f90 -o app -lgfortran
помощью, я получаю сообщение об ошибке
/tmp/ccn2Zeac.o: In function `eg_fun':
routine.f90:(.text 0x42): undefined reference to `cos'
collect2: error: ld returned 1 exit status
Как я могу это решить?
Ответ №1:
При связывании с gcc
вами необходимо явно связать математическую библиотеку, используя -lm
. Вместо этого вы можете попробовать подключиться к gfortran.
iso_c_binding
Модуль не имеет никакого отношения к вашей ошибке. И bind(C)
атрибут тоже.
Комментарии:
1. догадываюсь, что у этого парня это есть. если это не сработает, попробуйте
-lm
до и после-lgfortran
, потому что так оно и есть