【问题标题】:C++ makefile: use only some header files in include directoryC++ makefile:仅使用包含目录中的一些头文件
【发布时间】:2014-03-25 07:32:26
【问题描述】:

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

folderA: header1.h header2.h
folderB: header1.h(modified) file1.cpp (includes header1.h and header2.h)

我想编写一个使用来自folderBheader1.h 和来自folderAheader2.h 的Makefile。

但是如果我这样写我的 Makefile:

LOCAL_C_INCLUDES += \
folderA\

然后我在编译说some values are defined twice时出错,即使头文件以#pragma once开头。

知道如何实现吗?

我也尝试过在 makefile 中明确列出头文件,但它似乎不起作用。

【问题讨论】:

  • 如果你的编译器支持#pragma once头文件不应该包含两次,我不认为是makefile的原因,你检查你的源代码了吗?
  • 这适用于哪个工具链:gcc 还是 MS?修改来源是一种选择吗?如果是这样,您可以忽略本地包含,只需将源更改为 #include "folder A/header2.h" 或 "folder B/header1.h"。
  • 你可以试试#include "../FolderA/header2.h"(并删除makefile中的包含)!
  • 我闻到了一个 XY 问题:为什么要创建如此令人惊讶的设置?通常目标是实现最小的惊喜。您是否正在尝试解决不同的问题?

标签: c++ makefile


【解决方案1】:

关于包含文件,我倾向于只对包含包含的每个文件夹使用 -Ipath/to/folder。所以在这种情况下,那就是 -Ipath/to/folderA -Ipath/folderB 然后你可以在你的代码中写 #include "header1.h" #include "header2.h" 。

include 守卫(#ifndef 和 #pragma)不能跨编译单元工作,这就是为什么你永远都不应该在头文件中定义任何东西(说真的,它只会让你长期痛苦) ,只声明它们。

这将摆脱多重定义的问题。为什么?

一个编译单元是一个 .cpp 文件和所有包含的头文件。每个 .cpp 创建一个目标文件,其中包含代码的中间阶段二进制表示,这是编译阶段。然后在链接阶段将这些目标文件链接在一起。因为如果你有“float foo;”,每个 .cpp 都在 C++ 中单独处理。在 header.hpp 和 a.cpp 和 b.cpp 都包含 header.hpp 中,编译器如何知道您在运行应用程序时指的是哪个 foo?

【讨论】:

  • 感谢每一位回答的人。我在Android AOSP上编译,我猜工具链是gcc?我也在考虑 #include folderB/Header1.h #include folderA/Header2.h 解决方案。至于 dutt 的答案,我很抱歉,但我看不出你的答案与我最初在 makefile 中所做的有什么不同,这意味着使用包含文件所在的文件夹的路径。但是使用这种方法,我确实在编译时得到了关于重复定义的错误。
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多