我有一个包含多个文件夹的项目:
folderA: header1.h header2.h
folderB: header1.h(modified) file1.cpp (includes header1.h and header2.h)
我想编写一个Makefile,它使用header1.h
中的folderB
和header2.h
中的folderA
。
但是如果我这样写我的Makefile:
LOCAL_C_INCLUDES += \
folderA\
然后我在编译some values are defined twice
时遇到错误,即使标题文件以#pragma once
开头。
知道如何实现这个目标吗?
我还尝试在makefile中明确列出头文件,但它似乎不起作用。
答案 0 :(得分:0)
关于包含文件我倾向于只使用-Ipath / to /文件夹到包含includes的每个文件夹。所以在这种情况下,'-dpath / to / folderA -Ipath / folderB然后你可以在你的代码中写#include“header1.h”#include“header2.h”。
包含警卫(#ifndef和#pragma)不能在编译单元之间工作,这就是为什么你永远不应该(严肃地说,它只会让你长期痛苦)在头文件中定义任何东西,只声明他们。这将摆脱多重定义问题。为什么呢?
编译单元是一个.cpp文件和所有包含的标头。每个.cpp创建一个包含代码的中间阶段二进制表示的目标文件,这是编译阶段。然后在链接阶段将这些目标文件链接在一起。因为如果你有“float foo”,每个.cpp都是用c ++单独处理的。在header.hpp中,a.cpp和b.cpp都包含header.hpp,编译器在运行应用程序时如何知道你的意思?