Я должен сделать доказательство концепции при вызове подпрограмм 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 cc = SQRT (a * a + b * b) END
скомпилировал его с помощью g77 как g77.exe -c FORTRANfun.for
Я написал следующий код c …
#include 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
В ответ на ответ 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».
См. ЭТО