1

C/C++ からの FORTRAN サブルーチンの呼び出しに関する概念実証を行う必要があります。私は正しい方向にいるのかわかりません、私を導いてください....

私がしたことは...

次の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
4

2 に答える 2

4

ほとんどの場合、シンボルの大文字と小文字が原因です。

f77 コミラー フラグ "-fno-underscore" および "-fno-second-underscore" は、オブジェクト コード内のデフォルトの命名を変更するため、リンクに影響します。コマンド nm を使用してオブジェクト ファイルを表示できます (例: nm file.o)。

注: FORTRAN の大文字と小文字は保持されず、オブジェクト ファイルでは小文字で表されます。g77 コンパイラ オプション "-fsource-case-lower" がデフォルトです。GNU g77 FORTRAN では、コンパイル オプション "-fsource-case-preserve" を使用して大文字と小文字を区別できます。

これを参照してください

于 2014-05-15T04:57:20.757 に答える
2

Zeeshan answerに加えて、変数を Fortran に渡すためにポインターを使用する必要があります。

extern int __stdcall fact(int* n);
extern void __stdcall pythagoras(float* a, float* b, float *c);
于 2014-05-15T08:14:09.293 に答える