많은 다른 .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
Make는 손으로 할 수있는 작업을 자동화하는 방법입니다. Make 코드없이이 코드를 컴파일 할 수 있습니까? 그렇지 않다면 makefile을 만지면 도움이되지 않습니다. – Beta
컴파일에 링크 플래그를 적용하고 그 반대의 경우도 마찬가지입니다. –
너무 많은 의존성을 가진 소스 파일과 헤더 파일이 너무 많아서 직접 처리 할 수 없습니다. 너는 맞다. 나는 어리석게도이 두 변수를 바꿨다. 그들을 다시 전환하면 .f 파일을 만들 수있었습니다. gfortran은 .h 파일에 대한 에러를 내게주고있다. 그것들은 C 파일이라고 생각하는 것 같습니다. 그러나 그것은 또 다른 질문입니다. 도와 주셔서 감사합니다. – Bob