Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 创建生成文件时遇到问题_Makefile - Fatal编程技术网

Makefile 创建生成文件时遇到问题

Makefile 创建生成文件时遇到问题,makefile,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 No

我在制作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-获取一个集合并使用指向迭代器的指针通过

我对friends这件事产生的一些依赖性感到困惑,也对某些网站将lib.o包含在Makefile中的观点感到困惑


非常感谢您的帮助。提前感谢。

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

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

朋友部分由每个C++独立编译,头文件定义所有需要编译一个文件的信息。编译器强制执行友元规则。链接器将结果对象编织在一起,以使结果可执行


之所以包含lib.o,是因为人们正在使用基本库提供的标准代码。如果丢失了内容,则会出现链接错误。

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

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文件旧时,它才会构建每个对象文件,我认为这就是您试图实现的目标。

如果您的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 $@
OBJECTS=p6.o SetIter.o Node.o Set.o
CFLAGS=-ansi-pendantic-Wall-Wextra
CC=g++
#这将编译调用的任何对象文件(something.o)
#请注意,我使用的是自动变量--“$