Сделать файл чувствительным к определениям препроцессора

Я написал make-файл.

В make-файле я использовал переменную, скажем, EXTRAFLAGS, которая выглядит так.

EXTRAFLAGS += -D _MSC_VER
EXTRAFLAGS += -D BINARYINPUT
EXTRAFLAGS += -D ENABLEVERSION2D2

Далее я использую флаги компилятора

CFLAGS = -Werror -Wall -I $(INC) $(EXTRAFLAGS)

а также

mingw32-gcc $(CFLAGS) -o nameofexe  OBJ's 

Я использовал этот makefile без каких-либо проблем. Но когда я отключаю определения препроцессора, вводя «#» перед одним из статусов в EXTRAFLAGS и переделывая его, я получаю актуальную цель. Я не могу ввести определения препроцессора в конфиденциальный список.

Временный обходной путь, который я использую в настоящее время, заключается в том, чтобы ввести фальшивую цель, очистить и удалить все объектные файлы и перекомпилировать все. Но это пустая трата времени. Как я могу лучше управлять текущим сценарием?


person Ram    schedule 28.11.2011    source источник
comment
Вы имеете в виду, что если вы измените EXTRAFLAGS, файлы не будут перестроены?   -  person Some programmer dude    schedule 28.11.2011
comment
Да, когда я меняю экстрафлаги, они не перестраиваются   -  person Ram    schedule 28.11.2011


Ответы (2)


Make — это инструмент, который компилирует ваш проект новым, когда один из ваших файлов в проекте изменяется.

Например. когда вы изменяете свой файл .h, он распознает изменение и перестраивает все файлы, которые от него зависят, а затем перестраивает все, что зависит от новых сборок,...

Но когда вы меняете флаги компилятора и/или определения в make-файле, входные файлы проекта не изменяются, поэтому проект не перестраивается.

Есть три способа добиться того, чего вы хотите: Сначала выполните make clean вручную после изменения make-файла. Во-вторых, включить сам make-файл в ваш make-файл (и выдать там make clean, когда он изменился). И, наконец, переместите определения в какой-либо файл .h для конкретного проекта.

Как правило, только решение "in-a-h-file-on-self" является единственным, которое позволяет избежать создания всего нового, поскольку другие не знают, какие исходные файлы на самом деле имеют ссылку на измененные определения.

person flolo    schedule 28.11.2011
comment
Первый способ - это то, что я делаю в настоящее время. Третье — это то, чего я не хочу делать, потому что я не хочу, чтобы пользователи вообще касались источника. Пусть об этом беспокоится автор источника. Я добавил имя моего make-файла в список чувствительности вместе с моими объектными файлами. Это решает проблему. Второй способ, который вы указали, - это то, что я сделал, или это что-то другое? - person Ram; 30.11.2011
comment
@ram: да, это именно второй способ. - person flolo; 30.11.2011

Вы не сделали свой файл .o зависимым от файла Makefile внутри самого файла makefile.

Когда вы добавляете или удаляете комментарии в Makefile, вы ничего не меняете, от чего зависит файл .o, в отличие от редактирования файла .c.

Вы можете исправить это, просто создав зависимость вашего файла .o или .c, чтобы включить сам Makefile, и когда вы обновите что-либо в вашем Makefile, весь ваш исходный код будет перекомпилирован.

Например;

  SRC=a.c b.c
  OBJS=a.o b.o
  EXE=ab

  $(EXE): $(OBJS)
       gcc -o $(EXE) $(OBJS) $(...anything-else...)

  $(OBJS): $(SRC) Makefile

(Теперь есть лучшие способы создания списков .c и .o, но приведенного выше должно быть достаточно для этого примера)

person Soren    schedule 28.11.2011
comment
Ага. Это было именно то, что я должен был сделать. Внесите make-файл в список конфиденциальности вместе с файлами obj. Спасибо за помощь. - person Ram; 30.11.2011