【问题标题】:Adding a directory for the headers in a Makefile为 Makefile 中的标题添加目录
【发布时间】:2010-09-25 09:04:42
【问题描述】:

你好我想问你,如果有人知道如何在Makefile中为头文件添加一个目录以避免错误*.h not found,我尝试过这个选项但不起作用:

INC_PATH := -I /directory/to/add

【问题讨论】:

标签: include makefile header


【解决方案1】:

至少对于 GNU make,尝试隐式变量@987654321@,如:

CFLAGS=-I/directory/to/add

【讨论】:

    【解决方案2】:

    虽然目标最终是影响 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     = <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 的程序的生成文件(这个名称在微软创建同名命令之前的十年或更长时间)。我假设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)进行调整的情况下进行调整所需要的。对于程序的消费者,有一个由autoconf 生成的configure 脚本,所以他们不必担心这些位是否正确。但是,这与该代码具有很强的遗传相似性,包括 UFLAGS 选项。

    请注意,许多用于构建 makefile 的系统都有一种设置 CFLAGS 的机制,与此类似 - 简单地分配给 CFLAGS 会撤消系统所做的良好工作。但是您必须了解您的 makefile 才能合理地修改它。

    ]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多