2014-01-22 102 views
0

我無法編寫一個可行的makefile。我已閱讀下面的教程(*),我看到,我們可以寫簡單的文件,如:我的makefile有什麼問題?

program : program.cpp 
    g++ -o program program.cpp -lm 

(*)http://www.pma.caltech.edu/~physlab/make.html

我試圖ADPT的例子,以滿足自己的需要,但它不工作:

interpreter: gvr_v51.c gvr_v51_interpreter.h 
    gcc gvr_v51_interpreter.h gvr_v51.c -pedantic -Wall -std=c99 -o gvr_v51 -lSDL 

parser: gvr_v51_parser.h gvr_v51.c 
    gcc gvr_v51_parser.h gvr_v51.c -pedantic -Wall -std=c99 -o gvr_v51 -lSDL 

我需要實現的是能夠允許用戶通過輸入「make interpreter」或「make parser」進行編譯。兩者的區別在於第一個將包含頭文件gvr_v51_interpreter.h,而另一個將包含頭文件gvr_v51_parser.h

兩個頭文件是相同的,除了一個#define行在兩個值中保持不同的值文件。頭文件的其餘內容包括結構聲明,枚舉聲明以及函數原型。

是我想達到的甚至可能嗎?如果是這樣,你能告訴我我做錯了什麼嗎?

謝謝。

+2

你得到了什麼錯誤? – AndyG

+0

的ubuntu @ Ubuntu的VirtualBox的:〜/文檔/ GVR $使解釋器 GCC gvr_v51_interpreter.h gvr_v51.c -pedantic -Wall -std = C99 -o gvr_v51 -lSDL 在文件從gvr_v51.c包括:3:0: gvr_v51_file_handling.c:函數'check_args': gvr_v51_file_handling.c:6:18:錯誤:'ARGC_EXPECTED'未聲明(首次在此函數中使用) gvr_v51_file_handling.c:6:18:注意:每個未聲明的標識符僅報告一次對於每個函數,它出現在 gvr_v51_file_handling.c:7:3:warning:隱式聲明函數'printf'[-Wimplicit-function-declaration] – lcazarre

+2

您可以使用-DInterpreter,然後將#ifdef放在標題中。它是一個更好的方式來做它比有兩個相同的文件...但我不知道爲什麼這不起作用 –

回答

1

您不能通過將頭文件附加到要編譯的c文件列表來包含頭文件。不過,您可以根據宏的定義包含頭並使用gcc選項預定義它。

在gvr_v51.c:

#ifdef INTERPRETER 
#include "gvr_v51_interpreter.h" 
#else 
#include "gvr_v51_parser.h" 
#endif 

在Makefile中:

interpreter: 
    gcc -lSDL -DINTERPRETER -o gvr_v51 gvr_v51.c 

parser: 
    gcc -lSDL -o gvr_v51 gvr_v51.c 
+0

工作。謝謝! – lcazarre

1

可以包括頭文件條件不改變的源文件(gvr_v51.c):

interpreter: gvr_v51.c gvr_v51_interpreter.h 
    gcc -include gvr_v51_interpreter.h gvr_v51.c -pedantic ... 
parser: gvr_v51_parser.h gvr_v51.c 
    gcc -include gvr_v51_parser.h gvr_v51.c -pedantic ... 

一旦這是工作,有幾種方法來改善它。特別是,我敦促你不要有兩個建立gvr_v51的規則,他們都不叫gvr_v51