2012-08-13 148 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) 

,当我在化妆陀螺型, 我收到输出:

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)你有没有试过简化这个makefile? 2)你是否尝试过从命令行运行该命令? – Beta 2012-08-13 13:46:31

+0

我做到了,但还不够。我从一位同事那里得到了这个信息,以便将其用于串口编程,但对makefile没有可接受的经验(我只是使用了“make all”,因为其他一些makefiles)。我通常需要这样的makefile:编译我的文件夹中的所有c文件,并从它建立一个可执行文件称为陀螺仪..这就是我所需要的,但我可能需要休息一下..感觉就像它不会进入我的脑海。 :-( – Aureon 2012-08-13 15:12:22

+0

这需要几次迭代,从命令行试试这个命令:'g ++ -Wall -c main.c -o main.o'。如果它能正常工作,我们就可以建立起来 – Beta 2012-08-13 16:00:01

回答

5

您在g++命令行中看到两个空的-D条目?他们造成了这个问题。您必须-D项目中具有值,例如, -DWIN32

如果你在使用类似-D $(SYSTEM)-D $(环境),那么你可以使用类似坚持:在这给他们的默认值makefile文件

SYSTEM ?= generic 
ENVIRONMENT ?= generic 

你的输出看起来缺少了所有重要的输出:

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

只是为了澄清,究竟得到了发送到g++-D -DWindows_NT,即定义一个预处理宏称为-DWindows_NT;这当然不是一个有效的标识符(类似于-D -I.

+0

Hi Petesh,感谢您的回复! 我现在收到此消息: '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 Makefile:102:目标'main.o'的配方失败 make [1]:*** [main.o]错误1 make [1]:离开目录'/ cygdrive/c/project' Makefile:85:目标'all'的配方失败 make:*** [all] Error 2' – Aureon 2012-08-13 15:15:25

+0

嗨,在评论中读取命令输出非常困难;请以更好的格式将其添加到问题中;但是再一次;你似乎错过了错误输出的重要部分,这使得调试非常困难。有人猜测,'i686-pc-mingw32-g ++'不在路径中。在我的系统,它被称为'的mingw32-G ++' - 了'的i686-PC-'前缀不存在 – Petesh 2012-08-13 15:26:36

+0

好!嗯,我想看看如果一个错误,但我们的系统不存在的mingw32-G ++安装(我想每个人'的mingw32-G打开它的手动++',但得到了“没有说明书” -message)。 有没有简化makefile的方法?你怎么看?顺便说一句:再次感谢您的时间! :-) – Aureon 2012-08-13 15:46:24