使一个简单的makefile通用

Make a simple makefile generic

本文关键字:简单 makefile 通用 一个      更新时间:2023-10-16

我有一个简单的makefile来帮助我编译一些示例:

   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104  
   clean:   
        rm -f *.o $(EXECUTABLE)

现在,这很好。问题是:我需要为每个例子显式地编写一条规则,从而多次复制以下行:

   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104

有没有办法将其通用化一点?因此,我最终会得到一个命令行,如下所示,它将从自动构建的ex252.cpp构建ex252

make ex252

幸运的是,它是一个仅限模板的库,所以我总是需要从一个cpp文件构建,并且不需要跟踪对象文件。

Make有一组默认规则,如果您使用默认规则来代替变量,那么您想要的规则应该有效。

如果你的make版本没有这样的默认值,这应该添加一个(它对应于GNU make默认规则,内联了一些中间变量,删除了过时的变量):

.cpp:
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@

CXX是C++编译器

CXXFLAGS是C++编译器的标志

CPPFLAGS是预处理器的标志(它们在gnu-make中的C和C++之间很常见)

LDFLAGS是链接的标志

TARGET_ARCH允许指定目标体系结构

LDLIBS是链接的库

也许类似于:

%: %.cpp
    $(CXX) $< $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o $@

有关$<$@的更多详细信息,请查看自动变量。

如果我正确理解你的问题,那么你正在寻找类似模式规则的东西。如果这是正确的,这个makefile应该编译目录中的每个cpp文件(取自这里):

%.o : %.cpp
        $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@

正如@AProgrammer所说,使用内置规则。我只想进一步阐述一下。

您可以通过递归地grepping make的数据库转储来找到内置的规则和标志。make -pq | grep %:获取可以生成可执行文件的规则列表,make -pq | grep '%: %.cpp' -A5查看它执行的实际命令。

在您的情况下,整个makefile可能看起来像:

all: ex104

只要默认目标需要ex104并且ex104.cpp存在,就会选择%: %.cpp内置规则。你可以在此基础上再接再厉。添加更多依赖项和标志。

CXXFLAGS += -Wall -Wextra -Wpedantic -std=c++14
all: ex104
ex104: common_utils.cpp

PS:内置CPP指的是C预处理器,而不是C++。