编写Makefile以自动获取文件名并创建具有相同名称

时间:2016-05-23 17:49:28

标签: linux git bash makefile

我想写一个Makefile,它选择每个.cpp文件并创建相应的名称可执行文件。

例如,如果我有3个文件:a.cppb.cppc.cpp。  我希望在make上执行以下行。

g++ a.cpp -o a -Wall
g++ b.cpp -o b -Wall
g++ c.cpp -o c -Wall

如何编写这样的Makefile?我试过这样的事情:

CC = g++
CFLAGS = -Wall

SRC=$(wildcard *.cpp)

test: $(SRC)
    gcc -o $^ $^ $(CFLAGS)

但严重的是这是我在Unix系统上的第一个Makefile。我写了很多严肃的Android.mk并且想过尝试一下。不行,但我觉得我很接近罚款。需要你的帮助。

3 个答案:

答案 0 :(得分:2)

我认为你覆盖了implicit rules of GNU make,这可能不是一个好主意。我会离开Makefile就像这样:

CXXFLAGS = -Wall

(没有任何规则,默认情况下CXX也设置为g++

然后,如果您有三个包含以下内容的文件:

#include <iostream>
int main() { std::cout << "Hello World!\n"; return 0; }

呼叫a.cppb.cppc.cpp(根据您的问题),您可以这样做:

make a
make b
make c

隐含的规则会照顾它。您可以添加包含二进制文件名称的all规则,隐式规则仍然有效。

注意

这对非gnu make无效。但是对于非gnu而言,大多数$@$<$*变量都不起作用。 (POSIX的数量非常少)

答案 1 :(得分:1)

最后,我对这个Makefile感到满意:

CC = g++
CFLAGS = -Wall

SRCS = $(wildcard *.cpp)

PROGS = $(patsubst %.cpp,%,$(SRCS))

all: $(PROGS)

%: %.cpp
    $(CC) $(CFLAGS) -o $@ $<

这就是我想要的。我相信它可以进一步改进。就像它甚至执行它。类似于./$@ < input,如果可能的话;)

答案 2 :(得分:1)

这是一个构建一个可执行文件的模式规则:

CXXFLAGS = -Wall

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

以下是您需要的变量:

SRC=$(wildcard *.cpp)
TARGS := $(src:.cpp=)

这里有一条规则可以全部调用它们:

test: $(TARGS)