2011-05-03 34 views
12

Tôi có một mã nguồn FORTRAN bao gồm nhiều tệp .F và .h khác nhau. Tôi cần phải xây dựng một tập tin thực thi từ nó, nhưng tôi đang gặp một số vấn đề. Các makefile mà tôi được sản xuất cho đến nay (có thể có sai sót như tôi với điều này) là:Tạo một makefile FORFAN

# 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 

Khi tôi cố gắng làm cho chương trình, tuy nhiên, tôi nhận được một loạt các sai sót tài liệu tham khảo không xác định. Tôi có nghĩa là, mọi chức năng và cuộc gọi chương trình con trong tệp .F được biên dịch đầu tiên sẽ trả lại một lỗi tham chiếu không xác định. Tôi nghĩ điều này là bởi vì gfortran đang cố gắng liên kết các tệp thay vì chỉ biên dịch chúng và sau đó liên kết ở cuối, nhưng tôi nghĩ tùy chọn '-c' được cho là để ngăn chặn điều đó.

CẬP NHẬT:

Khi người nhận xét đã chỉ ra, tôi đã trộn lẫn cờ biên dịch và liên kết. Hơn nữa, bạn không nên biên dịch tập tin * .h. Đây là tệp makefile mới nhất, được sửa chữa:

# 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 

Bây giờ khi tôi chạy, nó sẽ biên dịch mỗi tệp * .F, nhưng nó không thành công ở giai đoạn liên kết. Tôi nhận được một loạt các lỗi tham chiếu không xác định trong tệp * .F đầu tiên. Trình biên dịch dường như đi qua mỗi tệp * .F riêng lẻ trong giai đoạn liên kết, mà tôi không chắc chắn là chính xác. Sau đó, tôi nhận được một lỗi:

/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 

Tuy nhiên, nếu tôi gõ lệnh:

gfortran -o blah *.o 

Các thực thi sẽ được xây dựng, vì vậy nó có vẻ như tôi đã làm điều gì sai trong makefile cho giai đoạn liên kết.

UPDATE: 5/9/2011

Sverre chỉ ra các vấn đề chính thức với makefile của tôi. Trong mục tiêu đầu tiên của tôi là xây dựng chương trình, tôi sử dụng lệnh phím tắt chỉ phụ thuộc đầu tiên ($ <), nhưng tôi cần bao gồm tất cả các phụ thuộc (tức là tất cả các tệp * .o) bằng phím tắt ($ ^). Tệp làm việc cuối cùng, làm việc như sau:

# 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

Thực hiện chỉ là một cách để tự động hóa các tác vụ bạn có thể thực hiện bằng tay. Bạn có thể biên dịch mã này trên dòng lệnh mà không cần thực hiện? Nếu không, sau đó fiddling với makefile sẽ không giúp đỡ. – Beta

+5

Bạn đang áp dụng các cờ liên kết để biên soạn và ngược lại. –

+0

Có quá nhiều tệp nguồn và tiêu đề với quá nhiều phụ thuộc để tôi thực hiện việc này bằng tay. unapersson, bạn là chính xác. Tôi ngu xuẩn chuyển hai biến đó. Chuyển chúng trở lại cho phép tôi xây dựng các tệp .f. gfortran là cho tôi lỗi cho các tập tin .h mặc dù. Dường như họ nghĩ rằng đó là các tệp C. Nhưng đó là một câu hỏi khác. Cảm ơn đã giúp đỡ. – Bob

Trả lời

11

Bạn đang sử dụng GNU? Nếu vậy,

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

có thể là thủ phạm. $< là tên của trước tiên là điều kiện tiên quyết, nhưng bạn muốn tất cả các tệp *.o. Hãy thử sử dụng $^ để thay thế.

+2

Vâng, điều này là hoàn hảo. Tôi đã thực hiện thay đổi và nó đã hoạt động. Cuối cùng, làm việc makefile được đăng trong câu hỏi ban đầu của tôi. Điều thú vị là, tôi thực sự theo dõi một makefile cho mã này trong văn phòng của tôi ngày khác. Tuy nhiên, nó dài hơn tôi 20 lần bởi vì họ liệt kê từng phụ thuộc cá nhân. Rất vui vì tôi đã học đúng cách để làm điều này. – Bob

+1

nếu câu trả lời giải quyết được vấn đề của bạn, bạn nên đánh dấu nó là – steabert

+0

Thông thường, mọi người sử dụng '$ (FFLAGS)' thay vì '$ (FLFLAGS)' –