2012-08-13 146 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