instalar - Referencia indefinida a la función de Fortran en C++
gfortran gcc (1)
Parece que no puedo entender por qué esto no funciona.
/* main.cpp */
#include <stdio.h>
extern "C"
{
int __stdcall inhalf(int *);
}
int main()
{
int toHalf = 2;
int halved = inhalf(&toHalf);
printf("Half of 2 is %d", halved);
return 0;
}
Ok, eso se ve bien.
$ g++ -c main.cpp
Sin errores.
! functions.f90
function inhalf(i) result(j)
integer, intent(in) :: i
integer :: j
j = i/2
end function inhalf
Estoy bastante seguro de que es correcto.
$ gfortran -c functions.f90
Hasta aquí todo bien...
$ gcc -o testo main.o functions.o
main.o:main.cpp:(.text+0x24): undefined reference to `inhalf@4''
collect2.exe: error: ld returned 1 exit status
He estado buscando esto durante más de una hora, pero no pude encontrar nada que funcionara en este caso. ¿Cómo debería resolver esto?
Para una compatibilidad total de C, puede usar la función de vinculación del Fortran moderno:
! functions.f90
function inhalf(i) result(j) bind(C,name=''inhalf'')
integer, intent(in) :: i
integer :: j
j = i/2
end function inhalf
Esto le permite dar un nombre a la función que puede usar en C (y en otros) sin depender del esquema de nombres que su compilador usa por sí mismo.
La __stdcall
es solo Win32 (y el comportamiento predeterminado para la vinculación, ver aquí ). Puedes eliminarlo de forma segura. [En realidad, es necesario para compilar su código en Linux. ]