具有到父级的相对包含路径的 C++ makefile

Posted

技术标签:

【中文标题】具有到父级的相对包含路径的 C++ makefile【英文标题】:C++ makefile with relative include path to parent 【发布时间】:2020-01-20 12:08:39 【问题描述】:

我有一个工作项目,我需要在不更改代码的情况下从中提取部分内容,只需为其编写新的 main() 即可。 我的目录结构:

[main_dir]/[main.cpp]

[main_dir]/[dir1]/[child1]/file1.h

[main_dir]/[dir2]/[child2]/file2.h

在 main.cpp 我有:包括“dir1/child1/file1.h”

在 file1.h 我有:包含“dir2/child2/file2.h”

我正在编译: g++ main main.cpp

我得到“dir2/child2/file2.h”没有这样的文件或目录。 我不能改变 file1 做:包括“../../dir2/child2/file2.h”

不知何故,在原始项目中,在 makefile 中搜索所有相对于 [main_dir] 的包含路径,以便可以找到来自 file1.h 的包含。

我应该在 makefile 中添加什么才能做到这一点?

【问题讨论】:

g++ -o -l main main.cpp 看起来不正确。首先,-o 选项需要紧跟在它之后的输出文件的名称。其次,-l 选项是什么?是小写的L,还是大写的i? 已编辑,现在可能不需要这两个 【参考方案1】:

当使用双引号包含头文件时,如

#include "dir2/child2/file2.h"

那么编译器会使用当前文件所在目录来搜索头文件。

如果您的file1.h 中有它,那么编译器将查找头文件[main_dir]/dir1/child1/dir2/child2/file2.h。这是不正确的。

您可以通过告诉编译器将[main_dir] 添加到标准包含搜索路径列表来解决它。这是通过 -I(大写 i)选项完成的:

g++ -I [main_dir] main.cpp

然后当编译器在第一次搜索中找不到dir2/child2/file2.h时,它将继续使用标准包含搜索路径列表,应该可以找到。

【讨论】:

【参考方案2】:

您需要在您的Makefile 中管理CPPFLAGS

CPPFLAGS="-I[main_dir]"

并用这样的收据编译应用程序:

g++ $(CPPFLAGS) main.cpp -o main

另外,建议阅读 make style guides 以写出一个好的Makefile。您可以在那里遇到包含文件夹声明的提示。

【讨论】:

以上是关于具有到父级的相对包含路径的 C++ makefile的主要内容,如果未能解决你的问题,请参考以下文章

停止:从传播到父级的活动状态

Vuejs 中从子级到父级的事件监听

从子级到父级的跨站点 iframe postMessage

QuickControls2 图像不会拉伸到父级的全宽

setSizePolicy() 与 QSizePolicy.Expanding 不起作用:子级没有扩展到父级的大小

子元素设置margin-top影响到父级的原因及办法