2012-08-13 13 views
8

मैं वर्तमान में एक अच्छा makefile लिखने के असफल रहने के कारण कर रहा हूँ और पता नहीं है क्यों .. -.-Cygwin - Makefile-त्रुटि: लक्ष्य `main.o 'के लिए नुस्खा में विफल रहा है

यह मेरा main.c है :

#include <windows.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    printf("MEEEEEP"); 
    return (0); 
} 

यह मेरी makefile है:

:

# make SYSTEM= OS= ENVIRONMENT= 
# Binaries to use 
ifeq ($(ENVIRONMENT),MINGW) 
    CXX = i686-pc-mingw32-g++ 
else 
    CXX = g++ 
endif 
REMOVE = rm -vf 

RC  = windres 
EXE  = .exe 

############################################################# 
# Info 

ifeq ($(CXX),g++) 
INFO_CXX = g++ -dumpversion; g++ -dumpmachine 
endif 

############################################################# 
# Flags 

DEBUG = -DDEBUG -g 
OPTIMIZATION = -O2 #-Winline -finline-functions 

CFLAGS = -Wall -Wextra -W -static $(DEBUG) $(OPTIMIZATION) -D$(SYSTEM) -D$(OS) -D$(ENVIRONMENT) $(PRGFLAGS) 

ifeq ($(SYSTEM),I686) 
    CFLAGS += -m32 

    ifeq ($(OS),WIN32) 
    CFLAGS += -D_WIN32 
    endif 

    ifeq ($(ENVIRONMENT),MINGW) 
    CFLAGS += -fexceptions 
    endif 
endif 

LFLAGS = 

############################################################# 
# Files 

CFILES  = main.c 
OBJS  = ${CFILES:.c=.o} 

############################################################# 
# Include 

INCLUDES  = -I. 

############################################################# 
# Library 

LIBRARIES  = 

############################################################# 
# Targets 
.PHONY: all 
all:  
    @echo == Standard build: make SYSTEM=I686 OS=WIN32 ENVIRONMENT=MINGW 
    @echo 
    @echo 
    make SYSTEM=I686 OS=WIN32 ENVIRONMENT=MINGW gyro 

############################################################# 
# Implicit rules and filename extensions... 
.SUFFIXES: .h .o .c 

.c.o:  %.h 
     @echo Compiling $< for $(SYSTEM) $(OS) $(ENVIRONMENT) ... 
     @echo MEEP 
     $(CXX) $(CFLAGS) $(INCLUDES) -c $< -o [email protected] 
     @echo MEEP2 

############################################################# 
# Target rules 
gyro: $(OBJS) 
     @echo Building software for $(SYSTEM) ... 
     @echo 
     $(CXX) $(CFLAGS) $(LFLAGS) -o [email protected]$(EXE) $(OBJS) $(LIBRARIES) 

############################################################# 
# Clean 
.PHONY: clean 
clean: 
    $(REMOVE) $(OBJS) 


############################################################# 
# Info 
.PHONY: info 
info: 
    @echo 
    @echo Information about C++ Compiler/Linker: 
    @echo 
    $(INFO_CXX) 

जब मैं मेकअप जायरो में टाइप करें, मैं उत्पादन प्राप्त 0

Compiling main.c for Windows_NT ... 
MEEP 
g++ -Wall -Wextra -W -static -DDEBUG -g -O2 -D -DWindows_NT -D -I. -c main.c -o  main.o 
makeNew.mak:83: recipe for target `main.o' failed 
make: *** [main.o] Error 1 

लेकिन रेखा संख्या 83 पीछे है .c.o:% .h। और मुझे समझ में नहीं आता क्यों। क्या किसी के पास मेरे लिए कोई समाधान है?

+0

1) क्या आपने इस मेकफ़ाइल को सरल बनाने का प्रयास किया है? 2) क्या आपने कमांड लाइन से उस कमांड को चलाने का प्रयास किया है? – Beta

+0

मैंने किया लेकिन यह पर्याप्त नहीं था। सीरियल पोर्ट प्रोग्रामिंग के लिए इसका उपयोग करने के लिए मुझे सह-कार्यकर्ता से यह मिला लेकिन मेकफ़ाइल के साथ कोई स्वीकार्य अनुभव नहीं है (मैंने अभी "सभी को" बनाया है, क्योंकि कुछ अन्य ने मेकफ़ाइल बनाये हैं)। मैं आम तौर पर इस तरह एक मेकफ़ाइल चाहता हूं: इस फ़ोल्डर में मेरी सभी सी-फाइलों को संकलित करें और इसे से गियर नामक निष्पादन योग्य बनाएं .. मुझे बस इतना ही चाहिए, लेकिन मुझे ब्रेक की आवश्यकता हो सकती है .. ऐसा लगता है जैसे यह मेरे सिर में नहीं आ जाएगा। :-( – Aureon

+0

इसमें कुछ पुनरावृत्तियों का प्रयास किया जाएगा। कमांड लाइन से इसे आज़माएं: 'g ++ -Wall -c main.c -o main.o'। अगर यह काम करता है, तो हम इसे बना सकते हैं। – Beta

उत्तर

5

आप g++ कमांड लाइन में दो खाली -D प्रविष्टियों को देखते हैं? वे समस्या पैदा कर रहे हैं। आप -D आइटमों में मान हैं। -DWIN32

आप डी $ (प्रणाली) डी $ (पर्यावरण) तो आप की तरह कुछ का उपयोग कर सकते की तरह कुछ का उपयोग करने पर आग्रहपूर्ण रहे हैं: makefile जो उन्हें मूलभूत मूल्यों देता में

SYSTEM ?= generic 
ENVIRONMENT ?= generic 

आपका आउटपुट सभी महत्वपूर्ण उत्पादन लापता होने के लिए लग रहा है: परिभाषित एक पूर्वप्रक्रमक मैक्रो -DWindows_NT बुलाया

<command-line>:0:1: error: macro names must be identifiers 
<command-line>:0:1: error: macro names must be identifiers 

बस स्पष्ट करने के लिए, क्या वास्तव में g++ के लिए भेजा गया था -D -DWindows_NT है, यानी; जो निश्चित रूप से मान्य पहचानकर्ता नहीं है (इसी तरह -D -I. के लिए)

+0

हाय पेटेश, आपके उत्तर के लिए धन्यवाद! मुझे यह संदेश अब मिला है: 'MEEP i686-pc-mingw32-g ++ -Wall -Wextra -W -static -DDEBUG -O2 -DI686 -DWIN32 -DMINGW -m32 -D_WIN32 -fexceptions-I। -c main.c -o main.o मेकफ़ाइल: 102: लक्ष्य 'main.o' के लिए नुस्खाविफलबनाओ [1]: *** [main.o] त्रुटि 1 बनाओ [1]: निर्देशिका छोड़ना '/ cygdrive/c/project' मेकफ़ाइल: 85: लक्ष्य 'सभी' विफलता बनाने के लिए नुस्खा: *** [सभी] त्रुटि 2' – Aureon

+0

हाय, टिप्पणी में कमांड आउटपुट पढ़ने में बहुत मुश्किल है; कृपया इसे बेहतर प्रारूप में प्रश्न में जोड़ें; मगर फिर से; आपको त्रुटि आउटपुट का एक महत्वपूर्ण हिस्सा याद आ रहा है, जो इस अविश्वसनीय रूप से कठिन को डिबगिंग करता है।अनुमान में, 'i686-pc-mingw32-g ++' पथ में नहीं है। मेरे सिस्टम पर, इसे 'mingw32-g ++' कहा जाता है - 'i686-pc-' उपसर्ग मौजूद नहीं है – Petesh

+0

ठीक है! खैर मैंने यह देखने की कोशिश की कि क्या यह एक त्रुटि है, लेकिन हमारे सिस्टम पर कोई mingw32-g ++ स्थापित नहीं है (मैंने अपने मैनुअल प्रति 'मैन mingw32-g ++' को खोलने का प्रयास किया लेकिन "कोई मैन्युअल" -मेसेज नहीं मिला)। मेकफ़ाइल को सरल बनाने का कोई तरीका है? तुम क्या सोचते हो? बीटीडब्ल्यू: आपके समय के लिए फिर से धन्यवाद! :-) – Aureon

संबंधित मुद्दे