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

СМОТРИТЕ ЭТО

Другие вопросы по тегам