मैं फोरट्रान में नया हूं। मैं एक शोध परियोजना पर काम कर रहा हूं जहां मैं एक ओपन सोर्स प्रोजेक्ट का उपयोग कर रहा हूं जिसमें कई फ़ोल्डर्स में कई फाइलें वितरित की गई हैं। मुझे प्रत्येक कार्यक्रम की निर्भरता मिली लेकिन उन्हें संकलित करने का तरीका पता नहीं लगा सका।इंटरफ़ेस, मॉड्यूल और सबराउटिन वाले बहु-फ़ोल्डर फोरट्रान प्रोजेक्ट को संकलित करने के लिए कैसे करें
मेरे पास तीन फ़ोल्डरों में वितरित स्रोत कोड है। क) ख) इंटरफेस ग) सबरूटीन्स
मॉड्यूल मैं सबरूटीन्स फ़ोल्डर में '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 पहले ही संकलित है। निष्पादन योग्य कहने के लिए अपरिभाषित संदर्भ कहने में त्रुटि क्यों है? मैं क्या खो रहा हूँ?
+1 मुझे 'VPATH' एकाधिक निर्देशिका देने के बारे में पता नहीं था – Yossarian
धन्यवाद एमबीआर आपकी मेकफ़ाइल मुझे बहुत समझ में आता है। मैंने लिखने की कोशिश की लेकिन कार्यक्रम चलाने के माध्यम से नहीं मिल सका। समस्या यह है कि मेरे पास कई सबराउटिन के लिए बनाए गए सभी इंटरफेस हैं और उन इंटरफेस को "यूएसई" कीवर्ड का उपयोग करके Main.f90 प्रोग्राम में सूचीबद्ध किया गया है। इसी तरह मॉड्यूल का उपयोग "यूएसई" कीवर्ड का उपयोग करके मेन.एफ 9 0 में भी किया जाता है। चूंकि बड़ी फाइलें हैं, इसलिए मैं आपके उत्तर में उल्लिखित प्रत्येक फ़ाइल को सूचीबद्ध करने के बजाय गतिशील रूप से उन्हें कैसे जोड़ सकता हूं और उन्हें लिंक कर सकता हूं जैसे कि MODOBJ = module1.o module2.o ... – user2721314
मेरा संपादन देखें जो उम्मीदपूर्वक उत्तर देता है आपका नया सवाल – MBR