你好我想问你,如果有人知道如何为Makefile中的头文件添加目录以避免错误* .h找不到,我试过这个选项但不起作用:
INC_PATH := -I /directory/to/add
答案 0 :(得分:20)
至少对于GNU make,请尝试隐式变量CFLAGS
,如:
CFLAGS=-I/directory/to/add
答案 1 :(得分:15)
尽管目标最终会影响CFLAGS的价值(正如@unwind所建议的那样),但简单地设置CFLAGS的值通常不是一个好主意,因为它通常是由许多部分构建的。您必须了解makefile的结构以及使用的宏集。
[加:
爱德华多问道:你能发布宏吗?是的,但它们是否有用取决于您的makefile的结构。这是我的一个makefile中的一个中等复杂的例子。
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}
这是我的一个名为sqlcmd
的程序的makefile(在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 - 我在大多数makefile中使用的习语;它允许用户在make
命令行上设置UFLAGS并为构建添加额外的标志),以及一堆与库相关的宏。这就是我的开发makefile可以调整到我的开发平台(可以是Linux,Solaris或MacOS X)的最小问题。对于程序的使用者,{{1}生成configure
脚本因此,他们不必担心这些位是正确的。但是,这与该代码具有很强的遗传相似性,包括UFLAGS选项。
请注意,许多用于makefile构建的系统都有一种用于设置CFLAGS的机制,与此类似 - 只需分配给CFLAGS即可撤消系统所做的出色工作。但是你必须要理解你的makefile才能真正地修改它。