2016-07-27 8 views
0

내 프로그램은 intel MKL을 사용하는 mpi 프로그램입니다. 간단한 들어,이, 우리가 a.f90 다른 사람이 필요로 불리는 모듈 mymodFortran 90 용 Makefile이 생성되어 해결되지 않은 외부 기호가 발생합니다

보통

때문에 내가 처음으로, 난 그냥 두 번을이

mpiifort *90 /fast /Qmkl /MD -o main.exe 

처럼 컴파일을 포함하는 main.f90 a.f90 b.f90있다 가정하자 부족할 것입니다 mymod.mod

이제 재 컴파일 시간을 줄이기 위해 makefile을 사용하고 싶습니다. 나는 이렇게 쓰고있다.

IFORT = /fast 
MKL =/Qmkl 
LDFLAGS = /MD 
main:main.obj b.obj 
    mpiifort $(IFORT) $(MKL) $(LDFLAGS) $< -o [email protected] 
mymod.mod:a.f90 
    mpiifort /c $(IFORT) $(MKL) $(LDFLAGS) $< 
main.obj:main.f90 
    mpiifort /c $(IFORT) $(MKL) $(LDFLAGS) $< 
b.obj:b.f90 
    mpiifort /c $(IFORT) $(MKL) $(LDFLAGS) $< 

그러나 여기에 뭔가 틀린 것이 있어야한다. 나는 unresolved external symbol의 뭉치를 얻었다. 뭐가 잘못 되었 니?

+2

난을 만드는 (정규 표현식을 사용하는 것은 좋은 선택이 될 것입니다) 메이크 파일 전문가는 아니지만'main' 타겟이'mymod.mod'에 대한 명시적인 의존성을 가지지 않으므로 이것이 만들어지지 않을 것입니다. 나는 또한 완전히 틀릴 수 있었다 –

답변

0

먼저 다른 사람이 더 나은/더 완전한 답을 쓸 수 있으며 (또는 하나를 지시 할 수 있습니다.) 저는 이것을 환영합니다.하지만 아래에서는 아주 간단한 예를 제시합니다.

이제 우리는 오류의 (가능성이) 소스를 식별 할 수 있습니다 우리가 touch으로 컴파일 명령을 교체 할 경우 우리가 다음 우리의 "소스를 만들 경우, 우리는이 문제를

main:main.obj b.obj 
     touch [email protected] 
mymod.mod:a.f90 
     touch [email protected] 
main.obj:main.f90 
     touch [email protected] 
b.obj:b.f90 
     touch [email protected] 

을 보여주는 간단한 예제를 생성 할 수 있습니다

>make main 
: 우리가 다음 우리 main 실행 파일을 빌드 할 수 있습니다

>touch main.f90 b.f90 a.f90 

와 파일 "

하는 출력 : 이것은 mymod.mod 파일을 작성하지 않는 방법

touch main.obj 
touch b.obj 
touch main 

참고. 즉 은 main을 빌드 할 때 컴파일되지 않으므로 필수 symobols를 사용할 수 없습니다 (예 : a.obj을 사용할 수 없으므로 함수/루틴 등이 정의되지 않은 경우). 우리가 지금

main:main.obj b.obj mymod.mod 
     touch [email protected] 
mymod.mod:a.f90 
     touch [email protected] 
main.obj:main.f90 
     touch [email protected] 
b.obj:b.f90 
     touch [email protected] 

가 될 우리의 메이크를 조정하여 mainmymod.mod에 의존한다는 것을 보여 주면 우리는 지금 (첫번째 rm *.obj mymod.mod main를 수행하여 청소 후) main 구축을 시도 할 수 있습니다 우리가 얻을 : 그래서 우리는

>make main 
touch main.obj 
touch b.obj 
touch mymod.mod 
touch main 

건물 main의 일부로 mymod.mod 표적을 만드는 데 성공한 사람은 make입니다. 실제로 일부 타겟이 다른 타겟보다 먼저 빌드되도록하려는 경우가 있습니다 (예 : a.f90b.f90 전에 컴파일하려는 경우). 자동 생성을 원할 수도있는 종속성 목록을 사용하여이를 수행 할 수 있습니다 (예 : this question 참조).

+0

대단히 감사합니다 d_1999. 나는 더 쉬운 방법을 찾아 낸다.) – user15964

0

나는 우리가

인텔 포트란가 자동 분석 및 출력 종속 정보를 메이크 파일에 사용할 수있는 것, gen-dep라는 옵션을 제공 포트란 인텔을 사용하는 경우 가지 자동으로 방법을 알아낼.모드 파일 누락으로 인해 오류 메시지가있을 경우 그래서 그냥 을 다음 명령을 실행, 단지 두 번을 실행

mpiifort *90 /Qmkl /gen-dep > dependency.txt 

우리는 dependency.txt을 얻었다. 열어 봐, 우리는 이런 것을 발견 할 것이다.

mpifc.bat for the Intel(R) MPI Library 5.1.2 for Windows* 
Copyright(C) 2007-2015, Intel Corporation. All rights reserved. 

mymod.mod : \ 
    a.f90 

a.obj : \ 
    a.f90 

b.obj : \ 
    b.f90 mymod.mod 

main.obj : \ 
    main.f90 \ 
    c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.1.146\windows\mpi\intel64\bin\..\..\intel64\include\mpi_base.mod \ 
    c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.1.146\windows\mpi\intel64\bin\..\..\intel64\include\mpi_sizeofs.mod \ 
    c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.1.146\windows\mpi\intel64\bin\..\..\intel64\include\mpi_constants.mod \ 
    c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.1.146\windows\mpi\intel64\bin\..\..\intel64\include\mpi.mod \ 
    mymod.mod 

Microsoft (R) Incremental Linker Version 14.00.23026.0 
Copyright (C) Microsoft Corporation. All rights reserved. 

-out:a.exe 
-subsystem:console 
"-libpath:c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.1.146\windows\mkl\lib\intel64_win" 
"/LIBPATH:c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.1.146\windows\mpi\intel64\bin\..\..\intel64\lib\release_mt" 
"/LIBPATH:c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.1.146\windows\mpi\intel64\bin\..\..\intel64\lib" 
impi.lib 
a.obj 
b.obj 
main.obj 

mpi와 관련된 모듈은 정적이므로 그냥 제거한다. 몇 가지 간단한 텍스트 조작 후 (I 내 질문의 게시물에 몇 가지 오류를 해결 한) 우리는이 같은 올바른 makefile을 얻을 수있는, 좀 더 명확하고 컴팩트 한

IFORT = /fast 
MKL =/Qmkl 
LDFLAGS = /MD 
a: a.obj b.obj main.obj 
    mpiifort $(IFORT) $(MKL) $(LDFLAGS) $^ -o [email protected] 
mymod.mod : a.f90 
    mpiifort /c $(IFORT) $(MKL) $(LDFLAGS) $< 
a.obj : a.f90 
    mpiifort /c $(IFORT) $(MKL) $(LDFLAGS) $< 
b.obj : b.f90 mymod.mod 
    mpiifort /c $(IFORT) $(MKL) $(LDFLAGS) $< 
main.obj : main.f90 mymod.mod 
    mpiifort /c $(IFORT) $(MKL) $(LDFLAGS) $< 
+0

여전히 프로젝트에 새로운 파일을 삽입하는 것은 큰 고통이다. 그래서 더 이상 포트란에'make '를 사용하지 않습니다. 'cmake','scons','waf'와 같은 자동 빌드 도구가 훨씬 더 많이 있습니다. –

+0

@VladimirF 안녕하세요, 블라디미르입니다. 몇 년 전에 저는 makefile이 불필요하다고 생각했습니다. 몇 달 전, makefile을 사용하기 시작했습니다. 왜냐하면 빌드, 클린 등 여러 작업 모드를 커스터마이징하기가 편리하기 때문입니다. 일 전 전에는 버그를 집중적으로 추적하기 때문에 재 컴파일에 지쳐있었습니다. 의존성을 지정하는 더 나은 makefile을 작성해야합니다. 가까운 장래에 나는 당신과 같은 메이크 파일에 완전히 피곤할 것입니다 :) 그런데, 전통적인 방법을 비교하기 위해 포트란에 대한 cmake 또는 다른 도구에 대한 간단한 그림을 추가 하시겠습니까? 나는이 사이트를 수색하고 문제에 대한 좋은 해답을 찾지 못했다. – user15964

+0

여기에 무엇이든 넣는 것은 화제가 될 것입니다. 여기에 cmake에 대한 많은 질문이 있습니다 http://stackoverflow.com/search?q=cmake%2Bfortran 그리고 scons는 github에서 뭔가를 찾습니다 https://github.com/LadaF/PoisFFT/blob/master/src/SConstruct 하나는 내 꺼야.) cmake에 대한 문서 사이트도 있습니다. http://stackoverflow.com/documentation/cmake/topics –