2012-08-13 16 views
8

Actualmente estoy fallando a escribir un buen makefile y no saben la razón por la .. -.-Cygwin - MAKE-error: receta para el objetivo `main.o' fallidos

Esta es mi main.c :

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

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

Ésta es mi 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) 

cuando escribo en maquillaje giroscopio, i recibir la salida:

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 

Pero el número de línea 83 está detrás de .c.o:% .h. Y no entiendo por qué. ¿Alguien tiene una solución para mí?

+0

1) ¿Ha intentado simplificar este archivo MAKE? 2) ¿Has intentado ejecutar ese comando desde la línea de comando? – Beta

+0

Lo hice pero no fue suficiente. Obtuve esto de un compañero de trabajo para usar esto para la programación del puerto serie pero no tengo una experiencia aceptable con makefiles (acabo de utilizar "make all", porque algunos otros hicieron makefiles). Normalmente quiero un archivo makefile como este: compilo todos mis archivos c en esta carpeta y construyo un ejecutable llamado gyro de él ... eso es todo lo que necesito, pero puedo necesitar un descanso ... parece que no se me pasará por la cabeza. :-( – Aureon

+0

Esto tomará algunas iteraciones. Pruebe esto desde la línea de comando: 'g ++ -Wall -c main.c -o main.o'. Si funciona, podemos construir. – Beta

Respuesta

5

Verá las dos entradas -D vacías en la línea de comando g++? Ellos están causando el problema. Usted debe tener valores en los artículos -D, p. -DWIN32

si eres insistente usar algo así como $ -D (SISTEMA) -D $ (medio ambiente), entonces usted puede usar algo como:

SYSTEM ?= generic 
ENVIRONMENT ?= generic 

en el makefile que les da valores por defecto.

Su salida se parece faltar la salida de suma importancia:

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

sólo para aclarar, lo que en realidad fue enviado a g++ era -D -DWindows_NT, es decir, definir una macro preprocesador llama -DWindows_NT; que, por supuesto, no es un identificador válido (de manera similar para -D -I.)

+0

Hola, Petesh, gracias por su respuesta! Aparece este mensaje ahora: 'MEEP i686-pc-mingw32-g ++ -Wall -Wextra -W -estático -DDEBUG -O2 -DI686 -DWIN32 -DMINGW -m32 -D_WIN32 -fexcepciones -I. -c main.c -o main.o Makefile: 102: la receta para el destino 'main.o 'falló make [1]: *** [main.o] Error 1 make [1]: Saliendo del directorio '/ cygdrive/c/project ' Makefile: 85: receta para el destino' all' failed make: *** [all] Error 2' – Aureon

+0

Hola, es muy difícil leer la salida del comando en un comentario; por favor agrégalo a la pregunta en un mejor formato; pero otra vez; parece que te falta una parte importante de la salida de error, lo que hace que la depuración sea increíblemente difícil.En una suposición, 'i686-pc-mingw32-g ++' no está en la ruta. En mi sistema, se llama 'mingw32-g ++' - el prefijo 'i686-pc-' no está presente – Petesh

+0

Ok! Bueno, traté de ver si es un error, pero en nuestros sistemas no hay mingw32-g ++ instalado (intenté abrir su manual por 'man mingw32-g ++' pero recibí el mensaje "sin manual"). ¿Hay alguna manera de simplificar el archivo MAKE? ¿Qué piensas? Por cierto, gracias de nuevo por su tiempo! :-) – Aureon

Cuestiones relacionadas