2011-05-03 5 views
12

많은 다른 .F 및 .h 파일로 구성된 FORTRAN 소스 코드가 있습니다. 실행 파일을 빌드해야하지만 몇 가지 문제가 있습니다. 내가 지금까지 (나는이 새로운 해요로 오류가있을 수 있음) 생성 된 메이크 파일은 다음과 같습니다FORTRAN makefile 만들기

# compiler 
FC = /usr/bin/gfortran-4.5 

# compile flags 
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons 
# link flags 
FLFLAGS = -g -fbacktrace 

# source files and objects 
SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) \ 
     $(patsubst %.h, %.mod, $(wildcard *.h)) 

# program name 
PROGRAM = blah 

all: $(PROGRAM) 

$(PROGRAM): $(SRCS) 
    $(FC) $(FCFLAGS) [email protected] $< 

%.o: %.F 
    $(FC) $(FLFLAGS) -o [email protected] $< 

%.mod: %.h 
    $(FC) $(FLFLAGS) -o [email protected] $< 

clean: 
    rm -f *.o *.mod 

나는 그러나, 나는 정의되지 않은 참조 오류의 늪지고있어, 프로그램을 만들려고합니다. 즉, 컴파일 된 .F 파일의 모든 함수 및 서브 루틴 호출에서 정의되지 않은 참조 오류가 다시 발생합니다. gfortran이 파일을 컴파일하고 끝에 링크하는 대신 파일을 연결하려고했기 때문에 이것이라고 생각했지만 '-c'옵션이이를 방지하기로되어 있다고 생각했습니다.

는 UPDATE : 댓글이 지적했듯이

, 나는 컴파일 및 링크 플래그를 혼합. 또한 * .h 파일을 컴파일하지 않아야합니다. 여기에 최신의 수정 메이크입니다 : 내가 할 실행할 때

# compiler 
FC = /usr/bin/gfortran-4.4 

# compile flags 
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check -std=legacy 
# link flags 
FLFLAGS = 

# source files and objects 
SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) 

# program name 
PROGRAM = blah 

all: $(PROGRAM) 

$(PROGRAM): $(SRCS) 
    $(FC) $(FLFLAGS) -o [email protected] $< 

%.o: %.F 
    $(FC) $(FCFLAGS) -o [email protected] $< 

clean: 
    rm -f *.o *.mod 

지금, 그것은 코드의 각 * .F 파일을 컴파일합니다,하지만 연결 단계에서 실패합니다. 첫 번째 * .F 파일에서 정의되지 않은 참조 오류가 많이 발생합니다. 컴파일러는 연결 단계에서 각 * .F 파일을 개별적으로 처리하는 것으로 보입니다. 올바른지 확실하지 않습니다. 내가 명령을 입력하면, 그러나

/usr/lib/gcc/x86_64-linux-gnu/4.4.5/libgfortranbegin.a(fmain.o): In function `main': 
(.text+0x26): undefined reference to `MAIN__' 
collect2: ld returned 1 exit status 

: 실행 파일이 건설 될 예정

gfortran -o blah *.o 

을 내가 연결 스테이지 메이크에서 뭔가 잘못을 한 것 같다, 그래서 그런 오류가 발생합니다.

는 UPDATE : 2011년 5월 9일

Sverre 내 메이크와 함께 최종 문제를 지적했다. 프로그램을 빌드하는 첫 번째 대상에서 첫 번째 종속성 ($ <) 만 사용하는 바로 가기 명령을 사용하지만 ($ ^) 바로 가기를 사용하여 모든 종속성 (즉, 모든 * .o 파일)을 포함해야합니다. 마지막으로 작동하는 makefile은 다음과 같습니다.

# compiler 
FC  := /usr/bin/gfortran-4.5 

# compile flags 
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check 
# link flags 
FLFLAGS = 

# source files and objects 
SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) 
#  $(patsubst %.h, %.mod, $(wildcard *.h)) 

# program name 
PROGRAM = vipre 

all: $(PROGRAM) 

$(PROGRAM): $(SRCS) 
    $(FC) $(FLFLAGS) -o [email protected] $^ 

%.o: %.F 
    $(FC) $(FCFLAGS) -o [email protected] $< 

# %.mod: %.h 
# $(FC) $(FCFLAGS) -o [email protected] $< 

clean: 
    rm -f *.o *.mod 
+0

Make는 손으로 할 수있는 작업을 자동화하는 방법입니다. Make 코드없이이 코드를 컴파일 할 수 있습니까? 그렇지 않다면 makefile을 만지면 도움이되지 않습니다. – Beta

+5

컴파일에 링크 플래그를 적용하고 그 반대의 경우도 마찬가지입니다. –

+0

너무 많은 의존성을 가진 소스 파일과 헤더 파일이 너무 많아서 직접 처리 할 수 ​​없습니다. 너는 맞다. 나는 어리석게도이 두 변수를 바꿨다. 그들을 다시 전환하면 .f 파일을 만들 수있었습니다. gfortran은 .h 파일에 대한 에러를 내게주고있다. 그것들은 C 파일이라고 생각하는 것 같습니다. 그러나 그것은 또 다른 질문입니다. 도와 주셔서 감사합니다. – Bob

답변

11

GNU make를 사용하고 있습니까? 그렇다면

$(FC) $(FLFLAGS) -o [email protected] $< 

이 원인 일 수 있습니다. $<의 첫 번째 이름이고 전제 조건이지만 모든 *.o 파일이 필요합니다. 대신 $^을 사용해보세요.

+2

네, 완벽합니다. 나는 변화를 만들었고 효과가 있었다. 마지막으로 작동하는 makefile이 원래의 질문에 게시됩니다. 재미있는 점은 요 전날 내 사무실에서이 코드의 메이크 파일을 추적 한 것입니다. 그러나 각 개별 종속성을 나열하기 때문에 내 것보다 20 배 더 길다. 매우 기쁜 마음으로 이것을 할 수있는 올바른 방법을 배웠습니다. – Bob

+1

답변으로 문제가 해결되면 그것을 표시해야합니다. – steabert

+0

일반적으로 사람들은'$ (FLFLAGS)'대신'$ (FFLAGS)'를 사용합니다. –