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