私は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
をこれは私のメイクです:
:ここ`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ファイルが作成されますが、実行ファイルは決して完了しません。私はこれまでに私が見つけたすべてのソースが私のFortran/C++コードが正しいことを示唆しているので、エラーが私のmakefileにあると思われます。
'LIBS = -lblas -dgemmkernel.oこれは疑わしい。 'dgemmkernel.o'の前にダッシュがあるはずですか? – eriktous
C++コンパイラからネームマングリングを打つことはおそらく、オブジェクトファイルには 'gemmkernel_'はありませんが、' __Z10gemmkernelPiS_S_PdS_S0_S_S0_S_'のようなものがあります。 – talonmies