c++ - बनाने की जरूरत नहीं है अगर बनाने और बनाने में संकलन से बचें




compilation linker (2)

यहाँ से एक अनुवर्ती सवाल के रूप में: मेरा मेकफाइल लिंकिंग करेगा, भले ही कोड में कुछ भी बदल न जाए। क्यूं कर? मैं उस व्यवहार से कैसे बच सकता हूं, ताकि कोड कुछ नहीं बदलेगा, अगर कुछ नहीं होगा?

OBJS    = main_no_mkl.o
SOURCE  = main_no_mkl.cpp
HEADER =    IO.h
OUT     =       test
CXX     = ../../mpich-install/bin/mpic++
CXXFLAGS    =   -I../../intel/mkl/include   -Wl,--start-group    -Wl,--end-group    -lpthread   -lm -ldl    -Wall
LDFLAGS   =       ../../intel/mkl/lib/intel64/libmkl_scalapack_lp64.a       -Wl,--start-group       ../../intel/mkl/lib/intel64/libmkl_intel_lp64.a ../../intel/mkl/lib/intel64/libmkl_core.a  ../../intel/mkl/lib/intel64/libmkl_sequential.a    -Wl,--end-group ../../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_lp64.a -lpthread       -lm     -ldl

all: $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)

# create/compile the individual files >>separately<<
main_no_mkl.o:    main_no_mkl.cpp
    $(CXX)  -c  main_no_mkl.cpp $(CXXFLAGS)

.PHONY : all

वस्तुओं वास्तव में आपके आउटपुट की निर्भरता हैं, और आपके "सभी" लक्ष्य को आउटपुट (ओं) पर निर्भर होना चाहिए तो आपको इसके बजाय ऐसा कुछ करना चाहिए:

all: $(OUT)

$(OUT): $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)

समस्या आपके all लक्ष्य है यह एक all उत्पन्न नहीं करता (और चिह्नित है। फाइल भी) फ़ाइल के बारे में एक अनुस्मारक के लिए इस उत्तर की जाँच करें। (आप मेकफाइल के दूसरे नियम का उल्लंघन कर रहे हैं।)

तो दूसरा / etc समय आप चलाते make (मान लें .PHONY अंकन मौजूद नहीं था) all फाइल को देखने के लिए, उसे नहीं खोज पाएंगे और मान लें कि उसे इसे फिर से बनाने की आवश्यकता होगी

के साथ। .PHONY आप शॉर्ट सर्किट है कि फाइल ढूँढने तर्क और बस हमेशा मानता है कि इसे फिर से नुस्खा चलाने की जरूरत है।

इसलिए, अनिवार्य रूप से, आपने हमेशा से जोड़ने के कदम को चलाने के लिए कहा है ताकि ऐसा किया जा सके

उस समस्या को ठीक करने के बजाय इसका उपयोग करें

all: $(OUT)

$(OUT): $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)

रिकॉर्ड रन make -d और आउटपुट के माध्यम से पढ़ना आपको make -d





makefile