Смешанное программирование: вызов Фортрана из C
Я должен сделать подтверждение концепции вызова подпрограмм FORTRAN из C/C++. Я не знаю, в каком я направлении, пожалуйста, ведите меня...
То, что я сделал, это...
Я написал следующий код FORTRAN
INTEGER*4 FUNCTION Fact (n)
INTEGER*4 n
INTEGER*4 i, amt
amt = 1
DO i = 1, n
amt = amt * i
END DO
Fact = amt
END
SUBROUTINE Pythagoras (a, b, c)
REAL*4 a
REAL*4 b
REAL*4 c
c = SQRT (a * a + b * b)
END
скомпилировал его используя g77 как g77.exe -c FORTRANfun.for
Я написал следующий код c...
#include <stdio.h>
extern int __stdcall FACT (int n);
extern void __stdcall PYTHAGORAS (float a, float b, float *c);
main()
{
float c;
printf("Factorial of 7 is: %d\n", FACT(7));
PYTHAGORAS (30, 40, &c);
printf("Hypotenuse if sides 30, 40 is: %f\n", c);
}
скомпилировал его, используя компилятор Visual Studio C как cl /c new.c
Когда я пытался связать, как LINK new.obj FORTRANfun.o
Я получаю следующую ошибку...
new.obj : error LNK2019: unresolved external symbol _FACT@4 referenced in function _main
new.obj : error LNK2019: unresolved external symbol _PYTHAGORAS@12 referenced in function _main
new.exe : fatal error LNK1120: 2 unresolved externals
2 ответа
Помимо ответа Zeeshan, вы должны использовать указатели для передачи переменных в Fortran:
extern int __stdcall fact(int* n);
extern void __stdcall pythagoras(float* a, float* b, float *c);
Это происходит из-за символов в большинстве случаев.
Флаги компилятора f77 "-fno-underscore" и "-fno-second-underscore" изменят именование по умолчанию в объектном коде и, таким образом, повлияют на связывание. Можно просмотреть объектный файл с помощью команды nm (то есть: nm file.o).
Примечание: регистр в FORTRAN НЕ сохраняется и представлен в нижнем регистре в объектном файле. Параметр компилятора g77 "-fsource-case-lower" является значением по умолчанию. GNU g77 FORTRAN может быть чувствительным к регистру с опцией компиляции "-fsource-case-preserve".
СМОТРИТЕ ЭТО