未明确引用`gemmkernel _' - 从Fortran调用的C ++例程

时间:2011-12-08 01:30:26

标签: c++ reference fortran undefined

我一直在研究一个调用C ++方法的Fortran例程。我尝试制作时遇到以下错误:

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 个答案:

答案 0 :(得分: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