-1

c と fortran で書かれたファイルで構成されたプロジェクトを mex しようとしています。簡単にするために、この単純な関数を作成しました。

mysum.f

  SUBROUTINE mysum(a,b)
  REAL :: a,b,r

  r = a+b
  WRITE(*,*) r
  END SUBROUTINE mysum

およびtest.c

#include <mex.h>
#include <stdio.h>

extern void mysum(double *a, double *b);
double a,b;

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){

a   =(double) mxGetScalar(prhs[0]);
b   =(double) mxGetScalar(prhs[1]);

mysum(&a,&b);

return;
}

Intel Fortran Compiler (x64) を使用して、次を実行します。

ifort /c mysum.f

mysum.obj を作成します

Matlab (x64) では、Microsoft SDK をコンパイラとして使用しており、次のように記述しています。

mex -O -largeArrayDims LINKFLAGS="$LINKFLAGS /NODEFAULTLIB:MSVCRT.lib" test.c mysum.obj

残念ながら、次のエラーが発生します。

test.obj : エラー LNK2019: 関数 mexFunction で参照されている未解決の外部シンボル mysum test.mexw64 : 致命的なエラー LNK1120: 1 つの未解決の外部

この時点で私は立ち往生していて、何をすべきかわかりません。MSVCRT.lib との競合があったため、オプション /NODEFAULTLIB を使用しています。

助けが必要です。

4

2 に答える 2

1

または、Fortran では、ISO C Binding を使用して、Fortran プロシージャーが他の言語およびリンカーによって認識される名前を指定し、大文字と小文字を指定し、アンダースコアを必要としないようにすることができます。C との互換性が保証されるように、変数を宣言することもできます。あなたの例では、Fortran のデフォルトrealと Cdoubleはおそらく一致しません。https://stackoverflow.com/questions/tagged/fortran-iso-c-bindingまたは gfortran マニュアル (言語標準の一部であるため、そこにあるドキュメントがより一般的に適用されます)を参照してください。この例では:

SUBROUTINE mysum(a,b) bind ( C, name = "mysum" )
use iso_c_binding
implicit none
REAL (c_double) :: a,b,r

r = a+b
WRITE(*,*) r
END SUBROUTINE mysum
于 2013-09-14T04:59:19.683 に答える
0

おそらく、C コードの mysum にアンダースコアを追加する必要があります。

extern void mysum_(double *a, double *b);

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
//...
  mysum_(&a,&b);
//...
}

nm mysum.objすべてのサブルーチンの正しい名前を取得するために実行します。

于 2013-09-13T17:43:54.937 に答える