2014-01-22 2 views
0

Я не могу написать make-файл, который работает. Я прочитал следующий учебник (*), и я вижу, что мы можем писать простые файлы, такие как:Что не так с моим make-файлом?

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 

Что мне нужно добиться того, чтобы иметь возможность позволить пользователю компилировать, введя либо «сделать интерпретатор» или «сделать парсер». Разница между ними состоит в том, что первый будет включать заголовок gvr_v51_interpreter.h, в то время как другой будет включать заголовок gvr_v51_parser.h

Оба файла заголовка идентичны, за исключением одной строки #define, которая имеет различное значение в двух файлы. Оставшееся содержимое файлов заголовков включает объявление структур, перечислений, а также прототипов функций.

Является ли то, что я хочу достичь, даже возможно? Если да, не могли бы вы рассказать мне, что я делаю неправильно?

Спасибо.

+2

Какие ошибки вы получаете? – AndyG

+0

убунту @ Ubuntu-VirtualBox: ~/Documents/GvR $ сделать интерпретатор НКУ 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.

Смежные вопросы