2013-08-27 87 views
6

Tôi mới đến Fortran. Tôi đang làm việc trên một dự án nghiên cứu, nơi tôi đang sử dụng một dự án nguồn mở có một số tệp được phân phối trong nhiều thư mục. tôi tìm thấy sự phụ thuộc của mỗi chương trình nhưng không thể tìm ra cách biên dịch chúng.cách biên dịch Dự án Fortran đa thư mục có giao diện, mô-đun và chương trình con

Tôi có mã nguồn được phân phối trong ba thư mục. a) module b) giao diện c) thủ tục con

tôi muốn chạy một chương trình có tên là 'Main.f90' trong thư mục chương trình con, chương trình này có sự phụ thuộc của mã nguồn từ mô-đun và giao diện thư mục.

Tôi đang sử dụng nhật thực cho cấu trúc thư mục và makefile để biên dịch.

Bất kỳ trợ giúp nào về điều này đều được đánh giá cao.

UPDATE: Tôi làm theo các câu trả lời đăng bởi @MBR và @Stefan, vì một lý do VPATH đã không thể tìm thấy chương trình mã nguồn vì vậy tôi đã rõ ràng đường dẫn đến những thư mục nguồn trong Makefile của tôi. bên dưới là tập lệnh tạo tệp của tôi.

.PHONY: Mopac_exe clean 

    # Change this line if you are using a different Fortran compiler 
    FORTRAN_COMPILER = gfortran 
    SRC = src 

    #make main program 
    Mopac_exe: subroutines mopac.o 
     $(FORTRAN_COMPILER) mopac.o *.o -O2 -g -o bin/Mopac_exe -I Modules/ 

    #compile all the subroutines 
    subroutines: interfaces 
     $(FORTRAN_COMPILER) -c $(SRC)/subroutines/*.F90 -J Modules/Subroutines/ -I Modules/ 

    #compiles all the interfaces 
    interfaces: modules 
     $(FORTRAN_COMPILER) -c $(SRC)/interfaces/*.f90 -J Modules/ 


    # build all the modules and generate .mod file in Modules directory 
    modules: build_vast_kind 
     $(FORTRAN_COMPILER) -c $(SRC)/modules/*.f90 -J Modules/ 
     $(FORTRAN_COMPILER) -c $(SRC)/modules/*.F90 -J Modules/ 

    # compile vastkind.f90 files and generates the .mod file in Modules directory.Every other Modules and interfaces are dependent on this. 
    build_vast_kind:clean 
     $(FORTRAN_COMPILER) -c $(SRC)/modules/vastkind.f90 -J Modules/ 

    clean: 
     rm -f bin/Mopac_exe *.mod 
     rm -f Modules/*.mod 
     rm -f *.o 

Tôi đã biên soạn tất cả các mô đun và được đặt trong thư mục Mô-đun của thư mục gốc. Tất cả việc biên dịch diễn ra tốt đẹp. Tôi gặp lỗi khi tôi tạo tệp thi hành. Tôi nhận được lỗi sau.

gfortran mopac.o *.o -O2 -g  -o bin/Mopac_exe -I Modules/ 
    mopac.o: In function `main': 
    mopac.F90:(.text+0x27c1): multiple definition of `main' 
    mopac.o:mopac.F90:(.text+0x27c1): first defined here 
    getdat.o: In function `getdat_': 
    getdat.F90:(.text+0x22): undefined reference to `iargc_' 
    getdat.F90:(.text+0xf2): undefined reference to `getarg_' 
    symr.o: In function `symr_': 
    symr.F90:(.text+0xd3f): undefined reference to `symp_' 
    writmo.o: In function `writmo_': 
    writmo.F90:(.text+0x20c2): undefined reference to `volume_' 
    collect2: error: ld returned 1 exit status 
    make: *** [Mopac_exe] Error 1 

`iargc_ 'đang được sử dụng trong' tệp getdat và iargc đã được biên soạn. tại sao có lỗi trong khi làm cho thực thi nói tham chiếu không xác định? tôi đang thiếu gì?

Trả lời

6

Bạn có thể làm một Makefile trông như thế

F90=gfortran 
FFLAGS = -O0 
VPATH = modules:interfaces:subroutines: 
MODOBJ = module1.o module2.o ... 

your_executable: $(MODOBJ) main.o 
     $(F90) main.o -o your_executable 
%.o:%.f90 
     $(F90) $(FFLAGS) -c $^ -o [email protected] 

VPATH là đường dẫn của thư mục chứa Makefile của bạn sẽ tìm kiếm file nguồn, vì vậy nếu bạn biên dịch mã nguồn của bạn trong thư mục gốc của modules/, interfaces/subroutines/, bạn chỉ cần thiết lập VPATH như thế.

Nếu bạn có nhiều đối tượng và bạn không muốn viết tất cả mọi thứ bằng tay, bạn có thể lấy chúng bằng cách sử dụng thủ thuật sau đây

F90 = gfortran 
FFLAGS = -O0 
VPATH = modules:interfaces:subroutines 
SRCOBJ = $(wildcard modules/*f90) 
MODOBJ = $(SRCOBJ:.f90=.o) 

your_executable: $(MODOBJ) main.o 
     $(F90) main.o -o your_executable 
%.o:%.f90 
     $(F90) $(FFLAGS) -c $^ -o [email protected] 

Lệnh wildcard trong một Makefile cho phép bạn sử dụng một joker *; sau đó bạn chỉ cần nói rằng trong chuỗi bạn sẽ truy xuất trong $(SRCOBJ), bạn muốn thay thế .f90 bằng cách .o để lấy tên tệp của mô-đun của bạn.

+1

+1 Tôi không biết về việc cung cấp cho 'VPATH' nhiều thư mục – Yossarian

+0

Cảm ơn MBR Makefile của bạn rất có ý nghĩa đối với tôi. Tôi đã cố viết nhưng không thể chạy qua chương trình. Vấn đề là tôi có tất cả các giao diện được tạo cho một vài chương trình con và các giao diện đó được liệt kê trong chương trình Main.f90 sử dụng từ khóa "USE". Các mô-đun tương tự cũng được sử dụng trong Main.f90 sử dụng từ khóa "USE". Vì có các tệp lớn, cách tôi có thể tự động bao gồm và liên kết chúng thay vì liệt kê từng tệp như bạn đã đề cập trong Câu trả lời của bạn như MODOBJ = module1.o module2.o ... – user2721314

+0

Xem bản chỉnh sửa của tôi câu hỏi mới của bạn. – MBR

3

Bạn có thể tạo Makefiles như bình thường. Vấn đề lớn nhất phải là các tệp .mod. Giải pháp dễ nhất cho vấn đề này là tạo một thư mục riêng biệt, nơi các tệp này được lưu trữ và tìm kiếm.

Điều này có thể đạt được với các cờ -J-module cho lần lượt gfortranifort.