2012-11-25 31 views
25

की तुलना में विभिन्न निर्देशिका में आउटपुट बनाने के लिए पैटर्न बनाएं I मेकफ़ाइल बनाने की कोशिश कर रहा हूं जो मेरी स्रोत फ़ाइलों की तुलना में मेरी .o फ़ाइलों को एक अलग निर्देशिका में रखता है। मैं एक पैटर्न नियम का उपयोग करने की कोशिश कर रहा हूं इसलिए मुझे प्रत्येक स्रोत & ऑब्जेक्ट फ़ाइल के लिए समान नियम बनाने की आवश्यकता नहीं है। ,जीएनयू स्रोत

OBJDIR_DEBUG = Debug 
OBJ_DEBUG = $(OBJDIR_DEBUG)/src/main.o $(OBJDIR_DEBUG)/src/video.o 

all: $(OBJ_DEBUG) 

$(OBJ_DEBUG): %.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

यह काम नहीं करता है क्योंकि यह Debug/src/*.cpp पर मेरे स्रोत फ़ाइलों के लिए लग रहा है:

project/ 
+ Makefile 
+ src/ 
    + main.cpp 
    + video.cpp 
+ Debug/ 
    + src/  [contents built via Makefile:] 
    + main.o 
    + video.o 

मेरे Makefile तरह दिखता है:

मेरे परियोजना संरचना की तरह कुछ लग रहा है।

मैं निम्नलिखित की कोशिश की है:

# Broken: make: *** No rule to make target `Debug/src/main.cpp', needed by `Debug/src/main.o'. Stop. 
# As a test, works if I change "%.cpp" to "Debug/src/main.cpp", though it obv. builds the wrong thing 

# Strip OBJDIR_DEBUG from the start of source files 
$(OBJ_DEBUG): %.o: $(patsubst $(OBJDIR_DEBUG)/%,%,%.cpp) 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

# Broken: 
# Makefile:70: target `src/main.o' doesn't match the target pattern 
# Makefile:70: target `src/video.o' doesn't match the target pattern 

# Add OBJDIR_DEBUG in target rule 
OBJ = src/main.o src/video.o 

$(OBJ): $(OBJDIR_DEBUG)/%.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

उत्तर

23

documentation on static pattern rules फिर से पढ़ने के बाद, मैं निम्नलिखित पैटर्न नियम जो काम करने के लिए लगता है व्युत्पन्न।

$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, और मैं सुझावों के लिए खुला हूं।

+3

सबसे अच्छा तरीका है कि। – Beta

+1

क्या होता है यदि आपके पास OBJDIR_DEBUG के भीतर उपनिर्देशिकाएं हैं? मेरा अनुमान है कि संकलन विफल हो जाएगा क्योंकि आउटपुट निर्देशिका मौजूद नहीं है। – aardvarkk

3

किसी अन्य निर्देशिका में ऑब्जेक्ट्स बनाने के बजाय, आप किसी अन्य निर्देशिका में स्रोतों से ऑब्जेक्ट्स बनाने का प्रयास कर सकते हैं: अपनी मेकफ़ाइल निर्देशिका में रखें जहां ऑब्जेक्ट्स होने जा रहे हैं और VPATH का उपयोग करके अन्यत्र स्रोतों को देखने के लिए कहें। यह सर्वोत्तम काम करता है अगर सभी ऑब्जेक्ट फ़ाइलों को एक ही निर्देशिका में समाप्त होना चाहिए।

0

Makefile कि "डुप्लीकेट" स्रोत प्रत्येक स्रोत पर जीसीसी चलाकर अलग निर्माण निर्देशिका में पेड़ - https://stackoverflow.com/a/41924169/4224163