为啥Makefile找不到包含目录

Posted

技术标签:

【中文标题】为啥Makefile找不到包含目录【英文标题】:Why can't Makefile find include directories为什么Makefile找不到包含目录 【发布时间】:2019-06-03 18:33:15 【问题描述】:

我似乎无法使用 Makefile 在我的测试程序中包含标头。

我尝试使用-I 尝试相对路径,但没有成功。我是 Make 新手,由于某种原因,我很难理解它的用法。

我的代码,test.cpp

#include <iostream>
#include <results/enumTest.h>

int main()

   return 0;

还有我的 Makefile:

CFLAGS = -Wall -g -Wextra -Wpedantic -std=gnu++11 -m64 -Iinclude

test: test.o
    gcc $(CFLAGS) -I/.. -o  test test.o 

test.o: test.cpp
    gcc $(CFLAGS) -I/.. -c test.cpp

我的目录结构:

/testDir/
  ./results/enuMtest.h
  ./test/test.cpp
  ./test/Makefile

我希望我可以使用 Makefile 编译然后运行测试软件。这对我来说或多或少是一个教程。

【问题讨论】:

如果将包含更改为#include "results/enumTest.h",您是否仍然看到问题?看来您有 C++ 源文件,但您正在为它们使用 gcc。那可能很糟糕。 如何调用make 以及从哪个目录调用? 顺便说一句,-I/.. 实际上是指根目录不存在的父目录。我想你可能指的是-I../ -I/.. 有点奇怪...你试过-I.. 吗? 这确实是我的问题。下面给出的两个答案都非常有帮助。我接受了我所做的那个,因为它更好地描述了有关包含的指定问题。 【参考方案1】:

您的包含路径 -I/.. 无效。您正在尝试访问不存在的根目录的父目录。更改您的 Makefile 以使用相对路径而不是 -I..

这将按预期访问父目录:

CFLAGS = -Wall -g -Wextra -Wpedantic -std=gnu++11 -m64 -Iinclude

test: test.o
    g++ $(CFLAGS) -I.. -o  test test.o # Change here

test.o: test.cpp
    g++ $(CFLAGS) -I.. -c test.cpp # ...and here

注意删除的斜线。

编辑:正如@Lightness 所评论的,您应该使用"header.h" 而不是&lt;header.h&gt; 包含非系统标头。此外,由于您正在尝试编译 C++ 程序,因此建议使用 g++ 而不是 gcc(我已在上面的 sn-p 中对此进行了更新)。

【讨论】:

【参考方案2】:

有几个可能的改进。

您尝试将包含路径设置为 / 的父目录,即 /。 您尝试使用 gcc 而不是 g++ 编译 c++ 程序 在链接时,您不需要(它仍然可以)设置包含路径。 (测试: 测试.o) 由于您指定的文件树中没有名为 include 的目录,因此您也不需要 CFLAGS 中的 -Iinclude 通常 CFLAGS 的 C++ 变体被命名为 CXXFLAGS,但我没有在下面的修改示例中更改它。

更正后的 makefile 应该是:

CFLAGS = -Wall -g -Wextra -Wpedantic -std=gnu++11 -m64

test: test.o
    g++ $(CFLAGS) -o  test test.o 

test.o: test.cpp
    g++ $(CFLAGS) -I.. -c test.cpp

补充说明:

#include "" 代替 #include &lt;&gt; 也可以。不同之处在于,"" 从当前源文件的位置搜索包含的文件,而&lt;&gt; 使用您使用-I 指定的目录。 了解更多详情here

【讨论】:

以上是关于为啥Makefile找不到包含目录的主要内容,如果未能解决你的问题,请参考以下文章

目标嵌入在包含的Makefile中时找不到目标命令

在 RaspberryPI 上找不到 Erlang 包含目录

C++ - 执行makefile时找不到目录

vs2010,项目-〉属性-〉在C/C++章节中-〉常规节点-〉附加包含目录。为啥我找不到附加包含目录?

make: *** 没有指明目标并且找不到 makefile。 停止

在makefile中找不到.so library -l