我一直在研究一个调用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 ++代码是正确的。
答案 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