带有两个.cpp文件和一个标头文件的基本makefile

Basic Makefile with two .cpp files and a header file

本文关键字:文件 makefile 一个 两个 cpp      更新时间:2023-10-16

我想学习如何为包含3个文件的程序创建一个基本的makefile:A.CPP,B.CPP和B.H.我将B.H包括在A.CPP中,并调用在B.CPP中在此处声明并定义的函数。我经过了几个Makefile教程,并提出了这样的Makefile:

CC=g++
CFLAGS= -std=c++11 -Wall -pedantic -g
SOURCES= a.cpp b.cpp
DEPS= b.h
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=exec
all: $(EXECUTABLE)
    @echo Make has finished.
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $(EXECUTABLE)
%.o: %.cpp $(DEPS)
    $(CC) $(CFLAGS) -c -o $@ $<
clean: 
    $(RM) *.o *~ $(EXECUTABLE)

但是,当我制作和运行执行时,它无法按预期工作。编译器没有任何警告或错误,但是A.CPP中的功能调用被跳过,好像不存在。相反,如果我运行简单

g++ -std=c++11 -Wall -pedantic -g a.cpp b.cpp -o exec

我的程序按预期运行。显然,我在makefile中做的事情不是正确的,但我无法弄清楚什么。

CC=g++
CFLAGS= -std=c++11 -Wall -pedantic -g
SOURCES= a.cpp b.cpp
DEPS= b.h
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=exec
all: $(EXECUTABLE)
    @echo Make has finished.
$(EXECUTABLE): $(OBJECTS)
    $(CC)  $(OBJECTS) -o $@
.cpp.o:
    $(CC) $(CFLAGS) -c $*.cpp
clean: 
    $(RM) *.o *~ $(EXECUTABLE)

在阅读makefile示例时,像计算机一样阅读它很有用,可以在您浏览文件时替换字段。弹出的线是:

SOURCES= a.cpp b.cpp 
...
OBJECTS=$(SOURCES:.cpp=.o) 
...
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $(EXECUTABLE)
...
%.o: %.cpp $(DEPS)
    $(CC) $(CFLAGS) -c -o $@ $<

第一行定义了源文件。第二个定义了可以从.cpp文件构建makefile所说的对象文件(Extension .o)。第三和第四定义了生成最终可执行文件的规则,该规则要求成功生成两个对象文件a.ob.o。最后两行定义了生成对象文件的规则,该规则指定了它们需要相同名称的.cpp文件和$(DEPS) == b.h文件。

最后,此makefile调用以下行:

g++ -std=c++11 -Wall -pedantic -g -c -o a.o a.cpp b.h
g++ -std=c++11 -Wall -pedantic -g -c -o b.o b.cpp b.h 
g++ -std=c++11 -Wall -pedantic -g a.o b.o -o exec

因此,看来您的代码中的断裂位于前两次传递给编译器的混合标志中。