我在制作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中的一些网站所带来的东西感到困惑。
非常感谢任何帮助。提前谢谢。
答案 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自动完成,但这是一种先进的技术。