Makefile无法找到包含路径。

4

当我从我的项目的主Makefile中使用时,子目录中的Makefile看不到include路径。我对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)

当我从tools/目录调用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个回答

3
如果是使用-I指令,应该写成#include <json/json.h>,否则写成#include "include/json/json.h"
编辑:包含目录是从当前目录中获取的,因此在main/目录下需要使用-Itools/include
解决方案:使用了隐式规则,因此必须为编译设置正确的变量CXXFLAGS+=$(INCLUDE)。请参见:make手册
主要问题是Main: main.o $(DEP),DEP中的文件必须已经存在,否则将使用隐式规则。稍后执行cd tools/ && make。

这就是我所拥有的。jsoncpp.cpp已经包含了#include<json/json.h>。这就是为什么我的INCLUDE只有-Iinclude/ - Cotant
好的,所以你现在在主目录/编译tools/json.cpp文件,并且只是使用了-Iinclude而不是-Itools/include? - KIIV
所以我尝试在主目录的makefile中将其更改为#include <json/json.h>,并使用-Itools/include,但仍然出现错误。 - Cotant
这些Makefile目前是有效的吗?我不明白为什么 $(CC) -c jsoncpp.cpp $(INCLUDE) 变成了 g++ -c -o tools/jsoncpp.o tools/json.cpp,它必须是完全不同的操作。 - KIIV
好像是自动规则... 请尝试添加CXXFLAGS+=$(INCLUDE)。更多信息:链接 - KIIV
显示剩余3条评论

0

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

参见gcc Include Syntax

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

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


这不是我写的文件,我是从Github上下载的。[https://github.com/open-source-parsers/jsoncpp] - Cotant
如果您从主目录调用make,则必须添加“-Itools/include”,以便预处理程序可以找到“tools/include/json/json.h”文件。 - frachop
如KIIV答案下的评论所述,我尝试了但没有成功。 - Cotant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接