2013-08-27 7 views
6

मैं फोरट्रान में नया हूं। मैं एक शोध परियोजना पर काम कर रहा हूं जहां मैं एक ओपन सोर्स प्रोजेक्ट का उपयोग कर रहा हूं जिसमें कई फ़ोल्डर्स में कई फाइलें वितरित की गई हैं। मुझे प्रत्येक कार्यक्रम की निर्भरता मिली लेकिन उन्हें संकलित करने का तरीका पता नहीं लगा सका।इंटरफ़ेस, मॉड्यूल और सबराउटिन वाले बहु-फ़ोल्डर फोरट्रान प्रोजेक्ट को संकलित करने के लिए कैसे करें

मेरे पास तीन फ़ोल्डरों में वितरित स्रोत कोड है। क) ख) इंटरफेस ग) सबरूटीन्स

मॉड्यूल मैं सबरूटीन्स फ़ोल्डर में 'Main.f90' के रूप में नाम के एक कार्यक्रम चलाने के लिए चाहते हैं, इस कार्यक्रम मॉड्यूल और इंटरफेस फ़ोल्डर से स्रोत कोड निर्भरता है।

मैं फ़ोल्डर संरचना और संकलन के लिए मेकफ़ाइल के लिए ग्रहण का उपयोग कर रहा हूं।

इसके साथ किसी भी मदद की सराहना की जाती है।

अद्यतन: मैं, जवाब @MBR और @Stefan द्वारा पोस्ट की गई पीछा के लिए किसी कारण VPATH स्रोत कोड में कार्यक्रमों ढूँढने में सक्षम नहीं किया तो मैं स्पष्ट रूप से मेरे Makefile में उन लोगों के स्रोत फ़ोल्डर के लिए पथ दे दी है। नीचे मेरी मेक फ़ाइल स्क्रिप्ट है।

.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 

मैंने सभी मॉड्यूल संकलित किए और रूट फ़ोल्डर की मॉड्यूल निर्देशिका में रखा। सभी संकलन अच्छी तरह से चला जाता है। जब मैं निष्पादन योग्य बनाता हूं तो मुझे त्रुटि मिलती है। मुझे निम्नलिखित त्रुटि मिलती है।

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_' का उपयोग 'getdat फ़ाइल' में किया जा रहा है और iargc पहले ही संकलित है। निष्पादन योग्य कहने के लिए अपरिभाषित संदर्भ कहने में त्रुटि क्यों है? मैं क्या खो रहा हूँ?

उत्तर

6

आप एक Makefile जो कि

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 तरह लग रहा है क्या कर सकते हैं निर्देशिका जहाँ आपके Makefile स्रोत फ़ाइलों के लिए दिखाई देगा, इसलिए यदि आप modules/ की रूट निर्देशिका में अपने स्रोत संकलन की पथ, interfaces/ है और subroutines/, आपको बस इस तरह VPATH सेट अप करना होगा।

आप कई वस्तुओं है और आप हाथ से सब कुछ लिखने के लिए नहीं करना चाहते हैं, तो आप उन्हें निम्नलिखित चाल

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] 

एक Makefile में wildcard आदेश आप एक जोकर * का उपयोग करने की अनुमति देता का उपयोग कर प्राप्त कर सकते हैं; तो आपको बस यह कहना होगा कि तारों में आप $(SRCOBJ) में पुनर्प्राप्त करेंगे, आप अपने मॉड्यूल के फ़ाइल नाम प्राप्त करने के लिए .f90.o को प्रतिस्थापित करना चाहते हैं।

+1

+1 मुझे 'VPATH' एकाधिक निर्देशिका देने के बारे में पता नहीं था – Yossarian

+0

धन्यवाद एमबीआर आपकी मेकफ़ाइल मुझे बहुत समझ में आता है। मैंने लिखने की कोशिश की लेकिन कार्यक्रम चलाने के माध्यम से नहीं मिल सका। समस्या यह है कि मेरे पास कई सबराउटिन के लिए बनाए गए सभी इंटरफेस हैं और उन इंटरफेस को "यूएसई" कीवर्ड का उपयोग करके Main.f90 प्रोग्राम में सूचीबद्ध किया गया है। इसी तरह मॉड्यूल का उपयोग "यूएसई" कीवर्ड का उपयोग करके मेन.एफ 9 0 में भी किया जाता है। चूंकि बड़ी फाइलें हैं, इसलिए मैं आपके उत्तर में उल्लिखित प्रत्येक फ़ाइल को सूचीबद्ध करने के बजाय गतिशील रूप से उन्हें कैसे जोड़ सकता हूं और उन्हें लिंक कर सकता हूं जैसे कि MODOBJ = module1.o module2.o ... – user2721314

+0

मेरा संपादन देखें जो उम्मीदपूर्वक उत्तर देता है आपका नया सवाल – MBR

3

आप अपनी मेकफ़ाइल सामान्य रूप से बना सकते हैं। सबसे बड़ी समस्या .mod फाइलें होनी चाहिए। इस समस्या का सबसे आसान समाधान एक अलग फ़ोल्डर बनाना है, जहां इन फ़ाइलों को संग्रहीत और खोजा जाता है।

यह -J और -modulegfortran और ifort के लिए क्रमशः -module के साथ प्राप्त किया जा सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे