我想写一个Makefile,它选择每个.cpp
文件并创建相应的名称可执行文件。
例如,如果我有3个文件:a.cpp
,b.cpp
和c.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并且想过尝试一下。不行,但我觉得我很接近罚款。需要你的帮助。
答案 0 :(得分:2)
我认为你覆盖了implicit rules of GNU make,这可能不是一个好主意。我会离开Makefile
就像这样:
CXXFLAGS = -Wall
(没有任何规则,默认情况下CXX
也设置为g++
然后,如果您有三个包含以下内容的文件:
#include <iostream>
int main() { std::cout << "Hello World!\n"; return 0; }
呼叫a.cpp
,b.cpp
和c.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)