我一直在研究一個調用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++代碼是正確的。
'LIBS = -lblas -dgemmkernel.o 「這看起來很可疑; 'dgemmkernel.o'之前你確定短跑應該在那裏嗎? – eriktous
你可能會碰到來自C++編譯器的命名錯誤,並且目標文件中沒有'gemmkernel_',而是'__Z10gemmkernelPiS_S_PdS_S0_S_S0_S_' – talonmies