Добавление каталога для заголовков в Makefile - PullRequest
22 голосов
/ 04 декабря 2008

Здравствуйте, я хотел бы спросить вас, если кто-то знает, как я могу добавить каталог для файлов заголовков в Makefile, чтобы избежать ошибки * .h не найден, я пробовал эту опцию, но не работает:

INC_PATH := -I /directory/to/add

Ответы [ 2 ]

20 голосов
/ 04 декабря 2008

Хотя бы для GNU make, попробуйте неявную переменную <a href="http://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html#index-CFLAGS-885" rel="noreferrer">CFLAGS</a>, например:

CFLAGS=-I/directory/to/add
15 голосов
/ 04 декабря 2008

Хотя в конечном итоге цель состоит в том, чтобы повлиять на значение CFLAGS (как предлагает @unwind), часто не очень хорошая идея просто устанавливать значение CFLAGS, поскольку оно часто состоит из множества частей. Вы должны понимать структуру make-файла и набор используемых макросов.

[ Добавлена ​​

Эдуардо спросил: Можете ли вы публиковать макросы, чтобы сделать то же самое?

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

CC        = gcc -g
XFLAGS    = -Wall -Wshadow -Wstrict-prototypes -Wmissing-prototypes \
            -DDEBUG -Wredundant-decls
#CC        = cc -g
#XFLAGS    =
UFLAGS    = # Always overrideable on the command line

DEPEND.mk  = sqlcmd-depend.mk
INSTALL.mk = sqlcmd-install.mk

ESQLC_VERSION = `esqlcver`
OFLAGS    = # -DDEBUG_MALLOC -g
OFLAGS    = -g -DDEBUG -O4
PFLAGS    = -DHAVE_CONFIG_H
OFILES.o  = # rfnmanip.o # malloc.o # strdup.o # memmove.o
VERSION   = -DESQLC_VERSION=${ESQLC_VERSION}
#INC1     = <defined in sqlcmd-depend.mk>
#INC2     = <defined in sqlcmd-depend.mk>
INC3      = /usr/gnu/include
INC4      = ${INFORMIXDIR}/incl/esql
INC5      = . #${INFORMIXDIR}/incl
INCDIRS   = -I${INC3} -I${INC1} -I${INC2} -I${INC4} -I${INC5}
LIBSQLCMD = libsqlcmd.a
STRIP     = #-s
LIBC      = #-lc_s
LIBMALLOC = #-lefence
LIBRDLN   = -lreadline
LIBCURSES = -lcurses
LIBPOSIX4 = -lposix4
LIBG      = #-lg
LIBDIR1   = ${HOME}/lib
LIBDIR2   = /usr/gnu/lib
LIBJL1    = ${LIBDIR1}/libjl.a
LIBJL2    = ${LIBDIR1}/libjlss-${ESQLC_VERSION}.a
LIBTOOLS  = ${LIBJL2} ${LIBJL1}
LDFLAGS   = ${LIBSQLCMD} ${LIBTOOLS} -L${LIBDIR2} ${LIBG} ${LIBMALLOC} \
            ${LIBPOSIX4} ${LIBC} ${STRIP}
CFLAGS    = ${VERSION} ${INCDIRS} ${OFLAGS} ${XFLAGS} ${PFLAGS} ${UFLAGS}

Это make-файл для моей программы с именем sqlcmd (имя, выбранное за десять и более лет до того, как Microsoft создала команду с тем же именем). Я предполагаю, что программа make имеет правило для компиляции кода C для объекта, подобного:

${CC} ${CFLAGS} -c $*.c

и что правило для связывания программы из набора объектных файлов, перечисленных в макросе OBJECTS, выглядит следующим образом:

${CC} ${CFLAGS} -o $@ ${OBJECTS} ${LDFLAGS}

Как видите, для ESQLC_VERSION есть отдельно устанавливаемые макросы (используемая версия Informix ESQL / C, полученная по умолчанию при запуске скрипта esqlcver), затем каталоги включения через INC1 - INC5 и INCFLAGS ( их может быть довольно много, в зависимости от платформы), а также флаги оптимизатора (OFLAGS), дополнительные флаги (CFLAGS), пользовательские флаги (UFLAGS - идиома, которую я использую в большинстве моих make-файлов; она позволяет пользователю устанавливать UFLAGS в командной строке make и добавление дополнительного флага в сборку), а также набор макросов, связанных с библиотекой. Это то, что нужно для того, чтобы мой make-файл разработки был легко настраиваемым на мою платформу разработки, которая может быть Linux, Solaris или MacOS X. Для потребителей программы существует сценарий configure, сгенерированный autoconf, поэтому им не нужно беспокоиться о том, чтобы получить правильные данные. Однако это имеет сильное генетическое сходство с этим кодом, включая опцию UFLAGS.

Обратите внимание, что многие системы для сборки make-файлов имеют механизм для установки CFLAGS, слегка похожего на этот, - и простое назначение CFLAGS отменяет хорошую работу, проделанную системой. Но вы должны понимать свой make-файл, чтобы иметь возможность его корректно изменять.

]

...