나는 C++ 메소드를 호출하는 포트란 루틴에서 작업 해왔다. 내가 만들려고 때 다음과 같은 오류를 받고 있어요 그것은 :`gemmkernel _ '에 대한 정의되지 않은 참조 - Fortran에서 호출 된 C++ 루틴
make -f makefile_gcc
오류 :
여기`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)
내 포트란 코드 :
이 내 메이크입니다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
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