C++ C++;makefile:只使用include目录中的一些头文件

C++ C++;makefile:只使用include目录中的一些头文件,c++,makefile,C++,Makefile,我有一个包含多个文件夹的项目: folderA: header1.h header2.h folderB: header1.h(modified) file1.cpp (includes header1.h and header2.h) 我想编写一个使用folderB中的header1.h和folderA中的header2.h的生成文件 但如果我这样编写Makefile: LOCAL_C_INCLUDES += \ folderA\ 然后,我在编译时出错,说一些值定义了两次,即使头文件以#p

我有一个包含多个文件夹的项目:

folderA: header1.h header2.h
folderB: header1.h(modified) file1.cpp (includes header1.h and header2.h)
我想编写一个使用
folderB
中的
header1.h
folderA中的
header2.h
的生成文件

但如果我这样编写Makefile:

LOCAL_C_INCLUDES += \
folderA\
然后,我在编译时出错,说一些值定义了两次
,即使头文件以
#pragma one开头

你知道怎么做到吗


我还尝试在makefile中显式列出头文件,但它似乎不起作用。

关于包含文件,我倾向于使用-Ipath/to/folder来包含包含这些文件的每个文件夹。因此,在本例中是-Ipath/to/folderA-Ipath/folderB,然后您可以在代码中编写#include“header1.h”#include“header2.h”

include-guard(ifndef和pragma)不能跨编译单元工作,这就是为什么您永远都不应该在头文件中定义任何内容,只声明它们

这将消除多定义问题。为什么?


编译单元是一个.cpp文件和所有包含的头文件。每个.cpp创建一个包含代码中间阶段二进制表示形式的对象文件,这是编译阶段。然后在链接阶段将这些对象文件链接在一起。因为每个.CPP都是在C++中单独处理的,如果在Heal.HPP中有“浮点FO”,并且A.CPP和B.CPP都包括Heal.HPP,那么编译器在运行应用程序时会知道哪一个FO?

如果编译器支持< Case>你检查过你的源代码了吗?这是哪个工具链:gcc还是MS?修改源是一种选择吗?如果是这样,您可以忽略本地包含,只需将源代码更改为#include“folder A/header2.h”或“folder B/header1.h”。您可以尝试#include“./FolderA/header2.h”(并在makefile中删除包含)!我闻到一个XY问题:为什么要创建这样一个令人惊讶的设置?通常情况下,我们的目标是达到最低限度的惊喜。你可能在试图解决一个不同的问题吗?感谢每一个回答的人。我是在Android AOSP上编译的,我猜工具链是gcc?我还考虑了#include folderB/Header1.h#include folderA/Header2.h解决方案。至于dutt的答案,我很抱歉,但我看不出您的答案与我最初在makefile中的答案有什么不同,这意味着使用包含文件所在的文件夹路径。但是使用这种方法,我确实会在编译时遇到关于重复定义的错误。