【发布时间】:2015-02-19 08:57:47
【问题描述】:
我是 make 文件的新手。
我有一个程序由
main.cpp
types.hpp
application/coordinator.hpp
application/correlation.hpp
application/handler.hpp
application/settings.hpp
libraries/basket.hpp
libraries/config.hpp
libraries/graphics.hpp
...
我有很多文件,我的文件列表会更新很多次。我希望 make 文件自动识别要生成或更新的 .o 文件。我不想在每次创建和包含新文件时更新我的 make 文件。输出必须在名为bin的目录中生成
main.cpp 是我唯一的 cpp 文件,其余文件是 hpp。
直到现在,这个link 启发了我编写这段代码:
CC=g++
CFLAGS= -g -Wfatal-errors
CFLAGS+= -std=c++11
LIBS= -lboost_filesystem -lboost_system
all: run
run: $(OBJS)
$(CC) $(CFLAGS) $^ main.cpp -o $@
$(OBJS): bin/%.o : bin/%.hpp
如何将其改进为工作代码和我想要的?
【问题讨论】:
-
通常的方法是让编译器为
.h/.hpp文件生成一个依赖列表(使用-Mx选项系列),并包含生成的.d(文件)与您的 makefile。 -
由于您只有一个
cpp文件,因此您将只有一个.o文件 -
@barej “你认为从
hpp文件中制作.o文件吗”你不认为,.o是从.cpp/.c文件。这些包含标题。你的意思是你在头文件中有内联代码吗?这样做的编译时间没有区别。 -
@barej 如果将 .hpp 包含到 main.cpp 中,则不能同时从 .hpp 生成 .o,因为它将包含相同类/对象/方法的定义,并且您'会得到链接错误(重复定义)。您需要考虑分离软件的接口(进入标头)和实现(进入 cpp 文件)。然后,您可以将标头包含在实现源和使用它的源中。然后你需要将生成的目标文件链接在一起。