2011-03-04 17 views
13

से दो अलग निष्पादन योग्य बनाना वर्तमान में, मेरे पास संकलन करने और काफी बड़ी परियोजना बनाने के लिए मेरा मेकफ़ाइल सेट अप है। मैंने परीक्षण चलाने के लिए मुख्य समारोह के साथ एक दूसरी सीपीपी फ़ाइल लिखी है। मैं इन्हें अलग से चलाने के लिए चाहता हूं, लेकिन एक साथ निर्माण करना और वे एक ही फाइल का उपयोग करते हैं। यह कैसे पूरा किया जाता है?मेकफ़ाइल (g ++)

संपादित करें: संदर्भ के रूप में, यहां मेरा वर्तमान मेकफ़ाइल है। मुझे यकीन नहीं है कि इसे कैसे समायोजित किया जाए।

CC=g++ 
CFLAGS=-c -Wall -DDEBUG -g 
LDFLAGS= 
SOURCES=main.cpp Foo.cpp Bar.cpp Test.cpp A.cpp B.cpp C.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=myprogram 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

उत्तर

17

आम तौर पर आप सिर्फ कई लक्ष्यों है और कुछ इस तरह करना होगा:

.PHONY: all target tests 

all: target tests 

target: ... 
    ... 

tests: ... 
    ... 

तो फिर तुम सिर्फ make (make all करने के लिए डिफ़ॉल्ट), या बस make target या make tests रूप में की जरूरत कर सकते हैं।

तो तुम ऊपर अपने makefile उदाहरण कुछ इस तरह है करने के लिए चाहते हो सकता है के लिए:

CC = g++ 
CFLAGS = -c -Wall -DDEBUG -g 
LDFLAGS = 
COMMON_SOURCES = Foo.cpp Bar.cpp A.cpp B.cpp C.cpp 
TARGET_SOURCES = main.cpp 
TEST_SOURCES = test_main.cpp 
COMMON_OBJECTS = $(COMMON_SOURCES:.cpp=.o) 
TARGET_OBJECTS = $(TARGET_SOURCES:.cpp=.o) 
TEST_OBJECTS = $(TEST_SOURCES:.cpp=.o) 
EXECUTABLE = myprogram 
TEST_EXECUTABLE = mytestprogram 

.PHONY: all target tests 

all: target tests 

target: $(EXECUTABLE) 

tests: $(TEST_EXECUTABLE) 

$(EXECUTABLE): $(COMMON_OBJECTS) $(TARGET_OBJECTS) 
    $(CC) $(LDFLAGS) $^ -o [email protected] 

$(TEST_EXECUTABLE): $(COMMON_OBJECTS) $(TEST_OBJECTS) 
    $(CC) $(LDFLAGS) $^ -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 
+0

मुझे यकीन है कि यह उत्तर सही है, लेकिन मैं मेकफ़ाइल के साथ अनुभवहीन हूं। मैंने पोस्ट में अपना वर्तमान पोस्ट पोस्ट किया है। क्या मेरे पास 2 "SOURCES =" लाइनें होंगी (स्पष्ट रूप से अलग-अलग नामों के साथ), जहां 1 में main.cpp शामिल है और इसमें परीक्षण मुख्य शामिल है, और फिर लक्ष्य के लिए मुख्य के साथ संदर्भ है? बस थोड़ा उलझन में। – socks

0

यहाँ एक तरह से यह करने के लिए:

CXXFLAGS += -std=c++11 -Wall -O3 

all: myprog mytest 

myprog.cpp: main.cpp 
    cp -vf $< [email protected] 
myprog: myprog.o Foo.o Bar.o Test.o A.o B.o C.o 

mytest.cpp: main.cpp 
    cp -vf $< [email protected] 
mytest.o: CPPFLAGS += -DDEBUG 
mytest.o: CXXFLAGS += -O0 -g 
mytest: mytest.o Foo.o Bar.o Test.o A.o B.o C.o 

यह काम करता है क्योंकि built-in rules ग से वस्तुओं संकलन के लिए मौजूद हैं ++ स्रोत (%.o: %.cpp) और मुख्य कार्यक्रमों को जोड़ने (%: %.o)।

वैरिएबल CPPFLAGS और CXXFLAGS के लिए target-specific मानों का उपयोग भी ध्यान दें।