【问题标题】:In what situations does make need to target an .h file在什么情况下需要以.h文件为目标
【发布时间】:2016-03-11 13:53:13
【问题描述】:

在我见过的 makefiles 示例下,头文件被列出(并且仅列出)作为这样的目标的依赖项,没有特定规则以 cc 文件的目标方式定位头文件本例中的规则

sample1.o : sample1.cc sampleheader1.h
   g++ -Wall -c sample1.cc

我的项目有这样的目录结构 源代码/你好.cc 头文件/cctz.h

cctz.hhello.cc 包含的头文件。

但是,当我为我的项目创建 makefile 时,make 抱怨 hello.o 需要 no rule to make target 'cctz.h。 makefile 在我的src 目录中,因此../headers 到达cctz.h

CPPOPTIONS = -I../headers
all: hello
hello: hello.o
  g++ -Wall -o $@
hello.o: hello.cc cctz.h
  g++ -Wall $(CPPOPTIONS) -c hello.cc

所以,在我的程序中,我需要 target 头文件,但在我见过的其他 makefile(例如我提供了一个 sn-p )中,头文件仅列为目标的依赖项,并且存在没有规则可以做到。我做错了什么或者为什么我需要针对我的情况下的cctz.h 文件(以及我该怎么做)

【问题讨论】:

    标签: c++ makefile


    【解决方案1】:

    make 程序首先在 makefiles 目录中查找文件,除非您指定文件的路径:

    hello.o: hello.cc ../headers/cctz.h
    

    make 对您设置的编译器选项一无所知,例如CPPOPTIONS.

    你也可以设置VPATH:

    VPATH = ../headers
    

    【讨论】:

    • 如果我将它作为变量传递,为什么不知道我在 CPPOPTIONS 中设置的编译选项? (我复制的演示 makefile 使用该 CPPOPTIONS 变量来设置标题目录)
    • @Leahcim 因为它不解析变量,而且make 可用于许多不同的事情(不仅用于构建 C++ 程序)它无法真正理解所有可能定义的选项搜索目录。
    • 好的,但我仍然必须在规则 g++ -Wall $(CPPOPTIONS) -c hello.cc 中包含 $(CPPOPTIONS) 才能编译,所以编译器理解 make 不理解的变量?
    • @Leahcim,make 是一个构建脚本。它对实际建造什么以及如何建造知之甚少。它不知道 CPPOPTIONS 是什么以及如何使用它。如果您这么说,它只是将它用作 g++ 的参数。您可能需要考虑切换到 cmake,它会为您生成正确的 makefile。
    • @Leahcim make 程序只是将变量$(CPPOPTIOS) 替换为它在创建它运行的命令时包含的文本。
    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多