1

我试图避免在 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: *没有规则使“main.o”需要创建目标“include/functions.h”来创建。关闭。

目录结构是

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

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

4

2 回答 2

2

您没有使用 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 $@

下载我的样品

那应该对你有帮助!

于 2013-10-21T13:49:29.527 回答
0

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

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

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

./include/functions.h:
    touch $@

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

于 2013-10-22T13:39:10.137 回答