неопределенная ссылка на `gemmkernel _'-- подпрограмма C ++, вызываемая из Фортрана - PullRequest
0 голосов
/ 08 декабря 2011

Я работал над процедурой на Фортране, которая вызывает метод 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

Это мой make-файл:

  `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) 

Вотмой код на Фортране:

             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 создаются, однако исполняемый файл никогда не создаетсязавершено.Я подозреваю, что ошибка связана с моим make-файлом, потому что каждый источник, который я нашел, говорит мне, что мой код на Fortran / C ++ правильный.

1 Ответ

1 голос
/ 08 декабря 2011

Ваша ссылка не работает во время ссылки.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
...