2013-08-27 32 views
6

Fortran'a yeni oldum. Birden fazla klasöre dağıtılmış birkaç dosya içeren bir açık kaynak projesi kullandığım bir araştırma projesi üzerinde çalışıyorum. Her programın bağımlılığını buldum ama onları nasıl derleyeceğimi anlayamadım.Arabirimler, modüller ve alt yordamlara sahip çok klasörlü Fortran Project'in nasıl derleneceği

Üç klasörde dağıtılmış kaynak kodum var. a) alt rutinler klasöründe 'Main.f90' olarak adlandırılan bir programı çalıştırmak istiyorum b) arayüzleri c) alt rutinler

modülleri, bu program modülleri ve arabirimler klasörlerden kaynak kodlarının bağımlılık vardır.

Klasör yapısı için eclipse ve derlemek için makefile kullanıyorum.

Bu konuda herhangi bir yardım için teşekkür ederiz.

GÜNCELLEME: Bazı nedeni vpath kaynak kodunda programları bulmak mümkün olmadı için Ben bu yüzden açıkça benim Makefile bu kaynak klasörün yolunu verdi @MBR ve @Stefan tarafından gönderildi cevabı izledi. aşağıda benim make dosyası betiğidir.

.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üm modülleri derledim ve kök Klasörünün Modüller dizinine yerleştirdim. Tüm derleme iyi gider. Yürütülebilir dosyayı oluşturduğumda hata alıyorum. Hata alıyorum. getdat dosya ve iargc 'kullanılıyor'

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_ zaten derlenmektedir. tanımsız referansı söyleyerek çalıştırılırken neden bir hata var? Neyi kaçırıyorum?

cevap

6

Bunu

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 gibi görünen bir Makefile yapabilirsiniz interfaces/ sen modules/ kök dizininde kaynağını derlemek yani eğer sizin Makefile, kaynak dosyaları arar dizinleri yolları olduğunu ve subroutines/, sadece böyle VPATH kurmak zorunda.

birçok nesne varsa ve her şeyi elle yazmak istemiyorsanız, bir Makefile wildcard komut jokerin * kullanmanızı sağlar

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] 

aşağıdaki hile kullanarak bunları geri alabilirsiniz; o zaman sadece dizeleri $(SRCOBJ) içinde alacağınızı söylemek zorundasınız, .f90 yerine .o modüllerin dosya adlarını almak istiyorum.

+1

+1 VPATH' çoklu dizinleri vermeyi bilmiyordum – Yossarian

+0

Teşekkür ederim MBR Makefile bana çok şey ifade ediyor. Yazmaya çalıştım ama programı çalıştıramazdım. Sorun şu ki, birçok altprogram için oluşturulan tüm arabirimlere sahibim ve bu arayüzler "USE" anahtar sözcüğünü kullanarak Main.f90 programında listeleniyor. Benzer şekilde, modüller "USE" anahtar sözcüğünü kullanarak Main.f90'da da kullanılır. Büyük dosyalar olduğu için, her bir dosyayı MODOBJ = module1.o module2.o gibi yanıtınızda belirttiğiniz gibi listelemek yerine, bunları dinamik olarak ekleyip bunları nasıl bağlayabiliyorum? – user2721314

+0

Umarım yanıt veren düzenlememe bakın yeni sorunuz – MBR

3

Makefiles'lerinizi her zamanki gibi oluşturabilirsiniz. En büyük sorun, .mod dosyaları olmalıdır. Bu soruna en kolay çözüm, bu dosyaların saklandığı ve aranabildiği ayrı bir klasör oluşturmaktır.

Bu

sırasıyla gfortran ve ifort için -J ve -module bayrakları ile elde edilebilir.