您好我想问你,如果有人知道如何在Makefile中添加头文件的目录以避免错误*.h找不到,我试过这个选项但不起作用:
INC_PATH := -I /directory/to/add
unwind.. 21
至少对于GNU make,尝试隐式变量CFLAGS
,如:
CFLAGS=-I/directory/to/add
Jonathan Lef.. 15
虽然目标最终是影响CFLAGS的价值(正如@unwind所建议的),但简单地设置CFLAGS的值通常不是一个好主意,因为它通常是由许多部分构建的.您必须了解makefile的结构以及使用的宏集.
[ 补充:
Eduardo问:你可以发布宏来做同样的事吗?
是的,但它们是否有用取决于您的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 =#INC2 = 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}
这是我的一个程序的makefile 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 - 我在大多数makefile中使用的一个习惯用法;它允许用户在make
命令行上设置UFLAGS 和在构建中添加一个额外的标志),以及一堆与库相关的宏.这就是我的开发makefile可以通过我的开发平台(可以是Linux,Solaris或MacOS X)轻松调整所需的内容.对于程序的使用者,有一个configure
脚本由autoconf
,所以他们不必担心这些比特是正确的.然而,这与该代码有很强的遗传相似性,包括UFLAGS选项.
请注意,许多用于makefile构建的系统都有一种用于设置CFLAGS的机制,与此类似 - 只需分配给CFLAGS即可撤消系统所做的出色工作.但是你必须理解你的makefile才能够明智地修改它.
]
至少对于GNU make,尝试隐式变量CFLAGS
,如:
CFLAGS=-I/directory/to/add
虽然目标最终是影响CFLAGS的价值(正如@unwind所建议的),但简单地设置CFLAGS的值通常不是一个好主意,因为它通常是由许多部分构建的.您必须了解makefile的结构以及使用的宏集.
[ 补充:
Eduardo问:你可以发布宏来做同样的事吗?
是的,但它们是否有用取决于您的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 =#INC2 = 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}
这是我的一个程序的makefile 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 - 我在大多数makefile中使用的一个习惯用法;它允许用户在make
命令行上设置UFLAGS 和在构建中添加一个额外的标志),以及一堆与库相关的宏.这就是我的开发makefile可以通过我的开发平台(可以是Linux,Solaris或MacOS X)轻松调整所需的内容.对于程序的使用者,有一个configure
脚本由autoconf
,所以他们不必担心这些比特是正确的.然而,这与该代码有很强的遗传相似性,包括UFLAGS选项.
请注意,许多用于makefile构建的系统都有一种用于设置CFLAGS的机制,与此类似 - 只需分配给CFLAGS即可撤消系统所做的出色工作.但是你必须理解你的makefile才能够明智地修改它.
]