为什么生成文件找不到包含目录

Why can't Makefile find include directories

本文关键字:包含目 找不到 文件 为什么      更新时间:2023-10-16

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

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

我的代码,test.cpp

#include <iostream>
#include <results/enumTest.h>
int main()
{
   return 0;
}

和我的制作文件:

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 编译并运行测试软件。这对我来说或多或少是一个教程。

您的包含路径-I/..无效。您正在尝试访问根目录的父目录,该目录不存在。将生成文件更改为使用相对路径,而不是使用-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"而不是<header.h>的非系统标头。此外,由于您正在尝试编译C++程序,因此建议使用 g++ 而不是 gcc(我已经在上面的代码片段中更新了这一点(。

有几种可能的改进。

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

更正后的生成文件将是:

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 <>也可以。不同之处在于,""相对于当前源文件的位置搜索包含的文件,而<>使用您使用 -I 指定的目录。在此处查找更多详细信息