Makefile找不到包含路径

时间:2015-09-01 20:52:13

标签: c++ makefile

我的项目子目录中的Makefile只在从我的项目的主Makefile中使用它时才能看到包含路径。我没有太多使用Makefiles的经验,而且我所阅读的很多东西都让人很困惑。这是我的目录的布局(自从我刚开始项目以来我到目前为止):

main/
    Inventory/
        Item.h
        Item.cpp
        Makefile
    tools/
        include/
            json/
                json.h
        jsoncpp.cpp
        Makefile
    main.cpp
    Makefile

这是主目录中的Makefile:

INCLUDE = -IInventory/
CC = g++
DEP = tools/jsoncpp.o Inventory/Item.o

Main: main.o $(DEP)
    cd tools/ && make
    cd Inventory/ && make
    $(CC) -o Main main.o $(DEP) $(INCLUDE)

main.o main.cpp
    $(CC) -c main.cpp $(INCLUDE)

这是工具目录中的Makefile:

INCLUDE = -Iinclude/
CC = g++

jsoncpp.o: jsoncpp.cpp
    $(CC) -c jsoncpp.cpp $(INCLUDE)

当我从工具/调用make时,它工作得很好。但是,当我从主目录调用make时,我收到此错误:

g++    -c -o tools/jsoncpp.o tools/json.cpp
tools/jsoncpp.cpp:76:23: fatal error: json/json.h: No such file or directory
#include "json/json.h"
                      ^
compilation terminated.

现在我部分地认为它无论出于什么原因都找不到包含目录,但是由于g ++和-c之间存在奇怪的差距,因此该错误的第一行对我来说相当奇怪。由于我的项目很快就会变得很大,我该如何解决这个问题呢?

2 个答案:

答案 0 :(得分:2)

如果它在-I指令中,则应为#include <json/json.h>否则为#include "include/json/json.h"

编辑:包含目录取自当前目录,所以在main /你必须使用-Itools/include

解决方案:使用了隐式规则,因此必须为编译设置正确的变量CXXFLAGS+=$(INCLUDE)。请参阅:make manual

主要问题是Main: main.o $(DEP) - DEP中的文件必须已经存在,否则它将使用隐式规则。之后的CD工具/&amp;&amp;做完了。

答案 1 :(得分:0)

#include <json/json.h>&lt; - 预处理器将搜索所有包含路径

请参阅gcc Include Syntax

  

#include <file>此变体用于系统头文件。它在标准系统列表中搜索名为file的文件   目录。您可以使用-I将目录添加到此列表中   选项(请参阅调用)。

     

#include "file"此变体用于您自己程序的头文件。它首先在目录中搜索名为file的文件   包含当前文件,然后在引用目录中然后   用于的相同目录。您可以将目录添加到   带有-iquote选项的引用目录列表。

相关问题