为什么Makefile找不到包含目录

时间:2019-06-03 18:33:15

标签: c++ gcc makefile

我似乎无法使用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运行测试软件。这或多或少是我的教程。

2 个答案:

答案 0 :(得分:6)

您的包含路径-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"而非<header.h>中包括非系统标题。此外,由于您正在尝试编译C ++程序,因此建议使用g++而不是gcc(我在上面的代码段中对此进行了更新)。

答案 1 :(得分:5)

可能有几处改进。

  • 您尝试将包含路径设置为/的父目录/。
  • 您尝试使用gcc而不是g ++编译c ++程序
  • 链接时,您不需要(仍然可以使用)设置包含路径。 (测试: test.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 <>也可以。区别在于""从当前源文件的位置搜索相对的包含文件,而<>使用您使用-I指定的目录。 查找更多详细信息here