MakeFile:不同目录中的标题 - 错误

Posted

技术标签:

【中文标题】MakeFile:不同目录中的标题 - 错误【英文标题】:MakeFile : Header in different Directory - Error 【发布时间】:2013-10-21 13:42:15 【问题描述】:

我试图避免在 C++ 文件的标头声明中使用相对路径。因此,我按照在线示例使用了 makefile。但我收到错误。请检查代码并帮助我解决此问题

COMPILER = g++
IDIR = ./include
CXXFLAGS += -I$(IDIR)
CFLAGS += -I$(IDIR)

EXEC = hello
OBJECTS = main.o factorial.o hello.o

all: $(EXEC)

(---- I had also used CFLAGS instead of CXXFLAGS below but the same result###)

$(EXEC): $(OBJECTS)
    $(COMPILER) $(CXXFLAGS) $(OBJECTS) -o $(EXEC)  

main.o: main.cpp ./include/functions.h 
    $(COMPILER) $(CXXFLAGS) -c main.cpp

factorial.o: main.cpp ./include/functions.h 
    $(COMPILER) $(CXXFLAGS) -c factorial.cpp

hello.o: main.cpp ./include/functions.h 
    $(COMPILER) $(CXXFLAGS) -c hello.cpp

错误:

make: * 没有规则使目标'include / functions.h" “main.o”需要创建。结束。

目录结构是

- main.cpp
- factorial.cpp
- hello.cpp
- MakeFile.mk
- +include (dir) 
      ----->functions.h

main.cpp 包含 ----include "functions.h"---- 在头声明中

【问题讨论】:

这是一个纯粹的make 错误消息。该错误与任何 .cpp 或 .h 文件的内容无关。错误实际上只能来自 Makefile 的内容,以及其中命名的文件是否存在。因此,make 声明它找不到文件include/functions.h。仔细检查它是否真的在这里,名称和大小写正确。 感谢您的回复。但是我使用的目录结构与帖子中提到的相同,并且我检查了拼写、匹配大小写,但一切似乎都如帖子中所示。我仍然得到同样的错误 只是检查一下,++include 目录名称的一部分吗? 出于调试目的,您可以在 Makefile 中添加以下行:./include/functions.h:\ttouch $@。 (其中\t 是一个制表符。)如果缺少,它将指示make 创建一个空的include/functions.h 文件。 我只是保留 + 以将其标识为帖子中的目录。你能不能给我一次上面的命令。 【参考方案1】:

您没有使用 h 文件作为源文件。 应该只有:

main.o: main.cpp $(COMPILER) $(CXXFLAGS) -c main.cpp

编辑:

我复制您的文件夹内容并编写简单的应用程序,其中 hello.cpp 具有简单的 void 函数,factorial.cpp 具有简单的 int-returning 函数,而 main.cpp 具有 int main() 并使用此函数,include.h hafe 声明这两个哑函数。 现在。我的 makefile 看起来:

COMPILER = g++
IDIR = ./include
CXXFLAGS += -I$(IDIR)
EXEC =  hello
OBJECTS =  main.o factorial.o hello.o

all: $(EXEC)

$(EXEC): $(OBJECTS)
        $(COMPILER) $(CXXFLAGS) $(OBJECTS) -o $(EXEC)

main.o: main.cpp factorial.o hello.o
    $(COMPILER) -c $(CXXFLAGS) $^ -o $@

factorial.o: factorial.cpp
    $(COMPILER) -c $(CXXFLAGS) $^ -o $@

hello.o: hello.cpp
    $(COMPILER) -c $(CXXFLAGS) $^ -o $@

download for my sample

这应该对你有帮助!

【讨论】:

感谢您的回复。当我进行相应更改时,我收到此错误 g++ -I./include -c main.cpp main.cpp:2:23:fatal error: functions.h: File or directory not found 是的,但是你已经指定了一个头文件。你必须有 -I./include/functions.h 所以将 IDIR = ./include 更改为 IDIR = ./include/functions.h 谢谢我也做了同样的事情现在我得到 g++ -I./include/functions.h -c main.cpp main.cpp:2:23:fatal error: functions.h: File或找不到目录但同样的错误即将到来 ` main.cpp:2:23:fatal error: functions.h: File or directory not found` 你没有在你的main.o: main.cpp $(COMPILER) $(CXXFLAGS) -c main.cpp提供-o main.o 【参考方案2】:

这是一个纯粹的make 错误消息。该错误与任何 .cpp 或 .h 文件的内容无关。错误实际上只能来自 Makefile 的内容,以及其中命名的文件是否存在。

根据此错误消息,make 指出它找不到文件 include/functions.h。仔细检查它确实在这里,名称和大小写正确。

出于调试目的,您可以在 Makefile 中添加以下行:

./include/functions.h:
    touch $@

如果缺失,它将指示 make 创建一个空的 include/functions.h 文件。

【讨论】:

以上是关于MakeFile:不同目录中的标题 - 错误的主要内容,如果未能解决你的问题,请参考以下文章

Makefile项目管理-----在Linux下编译c/c++程序

Make:变量赋值

从另一个makefile在Makefile中追加/替换字符串

Makefile相关知识

c++ - 如何使用make链接c ++中不同目录中的对象而不在makefile中引用它们?

Makefile:不同目录中的 Cpp 文件,将目标文件重定向到 ./obj 和可执行文件到 ./bin