Смешанное программирование: вызов FORTRAN из 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 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».

См. ЭТО