无法创建makefile

时间:2010-04-13 17:46:00

标签: makefile

我在制作Makefile时遇到了一些麻烦。现在写我只是每次编译所有内容。虽然教授对此很满意,但我确实希望让它更快地工作并避免不必要的编译。

这就是我所拥有的。

FILES= p6.cpp SetIter.cpp Node.cpp Set.cpp
CFLAGS= -ansi -pendantic -Wall -Wextra
CC= g++

MakePg6: p6.cpp SetIter.cpp Node.cpp Set.cpp
   $(CC) $(CFLAGS) $(FILES) -o pg6

Node.cpp - 节点类

Set.cpp - 使用节点。节点之友。

SetIter.cpp - 获取一个集合,并通过

使用指向迭代器的指针

我对一些依赖于朋友的东西以及lib.o被包含在Makefile中的一些网站所带来的东西感到困惑。

非常感谢任何帮助。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以简化制作文件,但在MakePg6的依赖项中使用$(FILES)

MakePg6: $(FILES)
   $(CC) $(CFLAGS) $(FILES) -o pg6

friend 部分由每个c ++独立编译解决,并且头文件定义编译该文件所需的所有信息。编译器强制执行好友规则。链接器将结果对象编织在一起以生成可执行的可执行文件。

lib.o是include,因为人们正在使用基本库提供的标准代码。如果你遗漏了东西,你会得到链接错误。

答案 1 :(得分:1)

如何尝试分离文件的制作,以便仅在需要时重建每个文件。

OBJECTS= p6.o SetIter.o Set.o Node.o

.cpp.o: $*.cpp
     $(CC) $(CFLAGS) -cpp $*.cpp
p6.o: p6.cpp SetIter.cpp // any file that it depends on
SetIter.o: SetIter.cpp Set.cpp //etc
Set.o: Set.cpp Node.cpp
Node.o: Node.cpp
p6: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o
MakePg6: p6

在这样做时,只有当.o文件比.cpp文件旧时才会构建每个目标文件,我认为这就是你要完成的目标。

答案 2 :(得分:0)

如果Makefile按写入方式工作,则必须正确设置头文件(例如Node.h)。因此,可以单独编译和链接不同的文件,但无论您是否这样做,都必须考虑头文件的依赖性。

OBJECTS= p6.o SetIter.o Node.o Set.o
CFLAGS= -ansi -pendantic -Wall -Wextra
CC= g++

# This will compile any object file (something.o) that is called for
# Note that I am using automatic variables-- "$<" means the first prerequisite
# (the .cpp file), "$^" means all the prerequisites, and "$@" means the target.
%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

# If A.cpp (or A.h) includes B.h, then if you change B.h you must recompile A.o,
# So A.o depends on B.h.
# I will make some educated guesses about how you include header files:

SetIter.o Node.o Set.o: Node.h
Set.o: Set.h
SetIter.o p6.o: Set.h SetIter.h

# This will link the object files together to make pg6.
# Notice that the target is the name of thing actually made, a good practice.
pg6: $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@

你必须通过查看代码来计算出那些.h依赖项。有办法让g ++和Make自动完成,但这是一种先进的技术。

相关问题