2011-12-08 18 views
0

私はC++メソッドを呼び出すFortranルーチンで作業していました。私はそれを作るしようとしたとき、私は次のエラーを取得しています:`gemmkernel _ 'への未定義参照 - Fortranから呼び出されたC++ルーチン

make -f makefile_gcc 

エラー:

 
gfortran -O3 -o tgemm tgemm.o mytimer.o dgemmf.o -lblas -dgemmkernel.o 
dgemmf.o: In function `dgemmf_': 
dgemmf.f:(.text+0x135): undefined reference to `gemmkernel_' 
collect2: ld returned 1 exit status 
make: *** [tgemm] Error 1 

をこれは私のメイクです:

:ここ

`FC=gfortran 
    CC=gcc 
    FFLAGS = -O3 
    CFLAGS = -O5 
    BLASF=dgemmf.o 
    BLASFSRC=dgemmf.f 
    TIMER=mytimer.o 

    TGEMM=tgemm 
    ALL= $(TGEMM) 

    LIBS = -lblas -dgemmkernel.o 

    all: $(ALL) 

    $(TGEMM): dgemmkernel.o tgemm.o $(TIMER) $(BLASF) 
     $(FC) $(FFLAGS) -o $(TGEMM) tgemm.o $(TIMER) $(BLASF) $(LIBS) 

    dgemmkernel.o: dgemmkernel.cpp 
     $(CC) $(CFLAGS) -c dgemmkernel.cpp 

    tgemm.o: tgemm.f $(INCLUDE) 
     $(FC) $(FFLAGS) -c tgemm.f 
    clean: 
     rm -rf *.o $(ALL) 

は私のFortranコードであります

 
      SUBROUTINE DGEMMF(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, 
     $     BETA, C, LDC) 
    *  .. Scalar Arguments .. 
      CHARACTER*1  TRANSA, TRANSB 
      INTEGER   M, N, K, LDA, LDB, LDC 
      DOUBLE PRECISION ALPHA, BETA 
    *  .. Array Arguments .. 
      DOUBLE PRECISION A(LDA, *), B(LDB, *), C(LDC, *) 
    *  .. External Functions .. 
      LOGICAL   LSAME 
      EXTERNAL   LSAME 
    *  .. Local Scalars .. 
      LOGICAL   NOTA, NOTB 
      INTEGER   I, J, L 
    *  .. Parameters .. 
      DOUBLE PRECISION ONE   , ZERO 
      PARAMETER  (ONE = 1.0D+0, ZERO = 0.0D+0) 
    *  .. 
    *  .. Executable Statements .. 
    * 
    *  Set NOTA and NOTB as true if A and B respectively are not transposed 
    * 
      NOTA = LSAME(TRANSA, 'N') 
      NOTB = LSAME(TRANSB, 'N') 
    * 
    *  We only want C = A°B 
    * 
      IF ((ALPHA.NE.ONE).OR.(BETA.NE.ZERO).OR. 
     $ (.NOT.NOTA).OR.(.NOT.NOTB)) STOP 
    * 
    *  Start the operations. 
     CALL gemmkernel(M, N, K, A, LDA, B, LDB, C, LDC) 
     RETURN 

*  End of DGEMM. 
* 
     END 

ここに私がしようとしているC++のビットがあります

void gemmkernel_(int * M, int * N, int * K, 
        double * a, int * LDA, 
        double * b, int * LDB, 
        double * c, int * LDC) 

すべての.oファイルが作成されますが、実行ファイルは決して完了しません。私はこれまでに私が見つけたすべてのソースが私のFortran/C++コードが正しいことを示唆しているので、エラーが私のmakefileにあると思われます。

+1

'LIBS = -lblas -dgemmkernel.oこれは疑わしい。 'dgemmkernel.o'の前にダッシュがあるはずですか? – eriktous

+0

C++コンパイラからネームマングリングを打つことはおそらく、オブジェクトファイルには 'gemmkernel_'はありませんが、' __Z10gemmkernelPiS_S_PdS_S0_S_S0_S_'のようなものがあります。 – talonmies

答えて

1

あなたのmakeはリンク時に失敗します。 dgemmkernel.oはオブジェクトファイルのリストになければなりません。私はあなたがこの行をしたいと仮定します。

$(FC) $(FFLAGS) -o $(TGEMM) tgemm.o $(TIMER) $(BLASF) $(LIBS) 

する:

$(FC) $(FFLAGS) -o $(TGEMM) tgemm.o dgemmkernel.o $(TIMER) $(BLASF) $(LIBS) 

LIBS = -lblas -dgemmkernel.o  

する:

LIBS = -lblas 
+0

答えをありがとう。私はそれを試みたが、私はまだ同じエラーが出てくる。問題がどこに来るかについての他のアイデアは? – Tesomas

+0

dgemmf.oはどこから来たのですか?私はそれがあなたのmakefileにコンパイルされているのを見ません。 – milancurcic

+0

私はそれを理解しました。 .cppファイルの名前を.cに変更する必要がありました – Tesomas

関連する問題