2011-12-08 1 views
0

나는 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과 관련이 있다고 생각합니다.

+1

'LIBS = -lblas -dgemmkernel.o 이것은 의심스러워 보인다. 'dgemmkernel.o' 전에 대시가 있어야할까요? – eriktous

+0

아마도 C++ 컴파일러에서 이름 맹 글링을하는 것일 수 있습니다. 오브젝트 파일에는'gemmkernel_'이 없지만'__Z10gemmkernelPiS_S_PdS_S0_S_S0_S_'와 같은 것일 수도 있습니다. – talonmies

답변

1

링크 시간에 make가 실패합니다. 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 
+0

해답을 가져 주셔서 감사합니다. 나는 그것을 시도했다. 그러나 나는 아직도 같은 오류를 가지고오고있다. 문제가 어디로 들어오고 있는지에 대한 다른 아이디어? – Tesomas

+0

dgemmf.o의 출처는 어디입니까? 나는 그것이 당신의 makefile에서 컴파일되고있는 것을 보지 못했다. – milancurcic

+0

나는 그것을 이해했다. .cpp 파일의 이름을 .c로 변경해야했습니다. – Tesomas

관련 문제