繁体   English   中英

具有两个.cpp文件和头文件的基本Makefile

[英]Basic Makefile with two .cpp files and a header file

我想学习如何为包含3个文件的程序创建一个基本的Makefile:a.cpp,b.cpp和bh我在a.cpp中包含bh并调用在那里声明并在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)

但是,当我制作并运行exec时,它不能按预期工作。 编译器没有提供警告或错误,但是跳过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 $@ $<

第一行定义源文件。 第二个定义了Makefile所说的可以从.cpp文件构建的目标文件(扩展名.o)。 第三个和第四个定义了生成最终可执行文件的规则,这需要成功生成两个目标文件aobo 最后两行定义了生成目标文件的规则,该规则指定它们需要相同名称的.cpp文件和$(DEPS) == bh文件。

最后,这个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

所以看起来代码中的破坏是前两次传递给编译器的混合标志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM