2011-12-08 82 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 

這是我的makefile:

`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文件的不生成,但可執行文件永遠不會完成。我懷疑這個錯誤與我的makefile有關,因爲到目前爲止我發現的每個源代碼都表明我的Fortran/C++代碼是正確的。

+1

'LIBS = -lblas -dgemmkernel.o 「這看起來很可疑; 'dgemmkernel.o'之前你確定短跑應該在那裏嗎? – eriktous

+0

你可能會碰到來自C++編譯器的命名錯誤,並且目標文件中沒有'gemmkernel_',而是'__Z10gemmkernelPiS_S_PdS_S0_S_S0_S_' – talonmies

回答

1

您的連接時失敗。 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