为啥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"
而不是<header.h>
包含非系统标头。此外,由于您正在尝试编译 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 <>
也可以。不同之处在于,""
从当前源文件的位置搜索包含的文件,而<>
使用您使用-I
指定的目录。
了解更多详情here
【讨论】:
以上是关于为啥Makefile找不到包含目录的主要内容,如果未能解决你的问题,请参考以下文章
在 RaspberryPI 上找不到 Erlang 包含目录
vs2010,项目-〉属性-〉在C/C++章节中-〉常规节点-〉附加包含目录。为啥我找不到附加包含目录?