में ऑब्जेक्ट फ़ाइलों को कैसे स्थानांतरित करें मुझे ऑब्जेक्ट फ़ाइलों को एक अलग उपनिर्देशिका में रखने के लिए उपयोग करने का प्रयास करने में समस्या हो रही है, शायद एक बहुत ही बुनियादी तकनीक। मैं इस पृष्ठ में जानकारी का उपयोग करने की कोशिश की है: http://www.gnu.org/software/hello/manual/make/Prerequisite-Types.html#Prerequisite-Typesअलग-अलग उपनिर्देशिका
मैं मेकअप से निम्न आउटपुट प्राप्त: मेकअप: *** कोई नियम लक्ष्य ku.h', needed by
obj/kumain.o बनाने के लिए '। रूक जा।
हालांकि ku.h एक निर्भरता लक्ष्य नहीं है (हालांकि यह स्पष्ट रूप से # स्रोत फ़ाइलों के भीतर शामिल है)। जब मैं ऑब्जेक्ट फ़ाइलों के लिए उपनिर्देशिका का उपयोग करने की कोशिश नहीं करता (यानी ओबीजेडीआईआर भागों को याद करता हूं) यह ठीक काम करता है। क्यों सोचते हैं ku.h एक लक्ष्य है?
मेरी makefile यह है: (शैली जानकारी के विभिन्न स्रोतों को पढ़ने के बाद है)
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
VPATH=%.c src
VPATH=%.h src
VPATH=%.o obj
OBJDIR=obj
objects= $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o)
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(objects) : ku.h kudefines.h kuglobals.h kufns.h | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
.PHONY: clean
clean :
rm $(objects)
संपादित करें: मैं vpath निर्देश उपयोग करने के लिए परिवर्तन लागू कर दिया। मेरा संस्करण VPATH = xxx और vpath% .c xxx का खराब मिश्रण था। हालांकि अब मुझे एक और समस्या है (जो मैंने गलत vpath जोड़ने से पहले मूल समस्या थी)। यह अब उत्पादन होता है:
gcc -o ku -lhpdf obj/kumain.o obj/kudlx.o obj/kusolvesk.o ..etc
gcc: obj/kumain.o: No such file or directory
gcc: obj/kudlx.o: No such file or directory
gcc: obj/kusolvesk.o: No such file or directory
gcc: obj/kugetpuz.o: No such file or directory
gcc: obj/kuutils.o: No such file or directory
gcc: obj/kurand.o: No such file or directory
gcc: obj/kuASCboard.o: No such file or directory
gcc: obj/kuPDFs.o: No such file or directory
gcc: obj/kupuzstrings.o: No such file or directory
gcc: obj/kugensud.o: No such file or directory
gcc: obj/kushapes.o: No such file or directory
make: *** [ku] Error 1
ऐसा लगता है कि मेकअप एक वस्तु फ़ाइल के लिए अंतर्निहित नियम लागू करने नहीं है, हालांकि पुस्तिका का कहना है "अंतर्निहित नियम बताने के लिए प्रथागत तकनीक का उपयोग करें ताकि आपके द्वारा निर्दिष्ट की जरूरत नहीं है बनाने के उन्हें विस्तार से जब आप उनका उपयोग करना चाहते हैं। उदाहरण के लिए, सी संकलन के लिए एक निहित नियम है। फ़ाइल नाम निर्धारित करते हैं कि कौन से निहित नियम चल रहे हैं। उदाहरण के लिए, सी संकलन आम तौर पर एक .c फ़ाइल लेता है और एक .o फ़ाइल बनाता है। जब फ़ाइल फ़ाइल के अंत के इस संयोजन को देखा जाता है तो सी संकलन के लिए निहित नियम लागू करता है। " और यह भी "वीपीएटीएच या वीपीएथ में निर्दिष्ट निर्देशिकाओं के माध्यम से खोज अंतर्निहित नियमों के विचार के दौरान होती है (लागू नियमों का उपयोग देखें)।"
फिर से "उदाहरण के लिए, जब फ़ाइल foo.o के पास कोई स्पष्ट नियम नहीं है, तो अंतर्निहित नियमों को समझें, जैसे अंतर्निहित नियम foo.c को संकलित करने के लिए। अगर वह फ़ाइल मौजूद है। अगर ऐसी फ़ाइल में कमी है वर्तमान निर्देशिका, उचित निर्देशिकाओं के लिए खोज की जाती है। यदि किसी भी निर्देशिका में foo.c मौजूद है (या मेकफ़ाइल में उल्लिखित है), सी संकलन के लिए निहित नियम लागू किया गया है। "
मेरे मेकफ़ाइल के लिए काम करने के लिए निहित नियम प्राप्त करने में कोई सहायता की सराहना की जाएगी।
संपादित करें 2: जैक केली के लिए धन्यवाद मैंने .c फ़ाइलों को संकलित करने के लिए एक स्पष्ट नियम बना दिया है क्योंकि मैं कहीं भी निहित नियमों का उपयोग करने की कोशिश नहीं कर सका। Vpath जानकारी के लिए al_miro भी धन्यवाद।
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
OBJDIR=obj
vpath %.c src
vpath %.h src
objects = $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o)
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(OBJDIR) obj/%.o : %.c ku.h kudefines.h kuglobals.h kufns.h
$(CC) -c $(CPPFLAGS) $< -o [email protected]
.PHONY : clean
clean :
rm $(objects)
शैली ध्यान दें: '$ (CPPFLAGS)' परंपरागत रूप से, सी पूर्वप्रक्रमक झंडे के लिए इस्तेमाल किया जाता है, जबकि '$ (CFLAGS)' के लिए प्रयोग किया जाता है कंपाइलर के लिए झंडे। –