Как я могу определить #define в моих файлах Make

В моих файлах c/c++ есть несколько #define. В качестве примера:

#ifdef LIBVNCSERVER_HAVE_LIBZ
  /* some code */
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
  /* some more code */

Не могли бы вы рассказать мне, как я могу изменить свой Makefile.in, чтобы эти #define были во ВСЕХ файлах во время компиляции?

Спасибо.


person n179911    schedule 26.01.2010    source источник
comment
рассмотрите вместо этого изменение configure.ac или Makefile.am. Makefile.in не предназначен для потребления человеком.   -  person Anycorn    schedule 26.01.2010
comment
@unknown: configure.ac нужно будет установить значения где-нибудь в Makefile.in. Makefile.in частично предназначен для потребления человеком, если только вы не используете Automake или что-то еще для создания Makefile.in.   -  person Jonathan Leffler    schedule 26.01.2010


Ответы (3)


-DLIBVNCSERVER_HAVE_LIBZ -DLIBVNCSERVER_HAVE_LIBJPEG

Вы могли пройти мимо тех, кто в CPPFLAGS,

CPPFLAGS = -DLIBVNCSERVER_HAVE_LIBZ -DLIBVNCSERVER_HAVE_LIBJPEG

или создать новую переменную

CUSTOMDEFINES = -DLIBVNCSERVER_HAVE_LIBZ -DLIBVNCSERVER_HAVE_LIBJPEG

и передать его CPPFLAGS = -DEXISTINGFLAGS $(CUSTOMDEFINES)

Те наконец перейдут к gcc/g++ -D...

$(CC) $(CPPFLAGS)
person YOU    schedule 26.01.2010
comment
флаги препроцессора afaik должны фактически перейти к CPPFLAGS - person Christoph; 26.01.2010
comment
@s.mark - черт возьми, ты попал в самую точку .... Это то, что я пытался понять .... мой ответ был близок, но недостаточно близко :) - person t0mm13b; 26.01.2010
comment
cpp относится к препроцессору C, префикс CXX относится к C++. - person Anycorn; 26.01.2010
comment
Это полностью упускает смысл использования автоинструментов. Сценарий configure должен определять, следует ли устанавливать эти переменные, а не пользователь. - person William Pursell; 03.02.2010

Добавьте строку ниже в ваш make-файл:

DEFINES=LIBVNCSERVER_HAVE_LIBZ LIBVNCSERVER_HAVE_LIBJPEG
...
... further on in your makefile on the line where it says ....
...
    $(cc) ($(addprefix -D, $(DEFINES))) .....
...
...

Это служит примером, вы только добавляете еще одно определение к переменной DEFINES, на которую ссылаются в строке, как показано $(cc) -D$(DEFINES), в которой make автоматически расширяет переменную и компилирует те, которые #ifdefd.

Спасибо R Samuel Klatchko за то, что он указал на небольшую неточность... это специально для GNU make, вы можете использовать addprefix do правильно сделать это ($(addprefix -D, $(ОПРЕДЕЛЯЕТ))).

person t0mm13b    schedule 26.01.2010
comment
Это только добавит -D к первому определению (так что это даст -DLIBVNCSERVER_HAVE_LIBZ LIBVNCSERVER_HAVE_LIBJPEG). Если у вас есть GNU make, вы можете использовать addprefix, сделайте это правильно ($(addprefix -D, $(DEFINES))). - person R Samuel Klatchko; 26.01.2010
comment
@R Самуэль Клачко: отредактировал ответ, чтобы отразить ваш комментарий! Приветствую вас! :) - person t0mm13b; 26.01.2010
comment
Обычно $(CC) или ${CC} будут иметь CC в верхнем, а не в нижнем регистре. - person Jonathan Leffler; 26.01.2010

Не изменяйте свой Makefile.in. (и рассмотрите возможность использования Automake и преобразования вашего Makefile.in в гораздо более простой Makefile.am). Весь смысл этих #define в том, чтобы позволить скрипту configure определять их в config.h, а ваши исходные файлы должны #include ‹config.h›. Если вы поддерживаете пакет, вам нужно будет написать тесты в configure.ac, чтобы определить, установлен ли в используемой системе libvncserver с поддержкой jpeg и zlib. Если вы измените Makefile.in, чтобы они всегда определялись, то вы делаете предположение, что ваш код создается только на машинах, где эти функции доступны. Если вы сделаете такое предположение, вам все равно следует добавить проверки в configure.ac, чтобы подтвердить его, и настроить сценарий с ошибкой, если зависимости не выполняются.

person William Pursell    schedule 03.02.2010