неопределенная ссылка на «cos», когда я использую iso_c_binding

#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 , потому что так оно и есть