我必须经常编译小程序并运行它。因为每次为每个cpp文件编写编译命令 g++ -W -Wall file.cpp -o out
都很繁琐,我编写了一个小脚本来编译。
这是我写的脚本
#!/bin/bash
g++ -W -Wall $1 -o $1.out
所以,如果我必须编译file.cpp,我会compile file.cpp
,它将为我创建file.cpp.out
可执行文件。
并且,这样的file.cpp没有任何头文件或任何其他依赖项。
我知道如何为特定的file.cpp编写makefile(非常简单的情况)
file: file.cpp
g++ -W -Wall file.cpp -o file
但如果我必须编译file2.cpp,我必须再次更改上面的makefile或写新的。所以,我想要做的是,当我发出make file.cpp
命令时,它会生成可执行文件。当我给 make file2.cpp
时,它会生成file2作为可执行文件,类似于其他cpp文件。
答案 0 :(得分:5)
export CXXFLAGS="-W -Wall"
rm Makefile
make file1
制作合理的默认值。您不必编写makefile来使用make。
Make有一组通用规则,当没有特定规则时,它会自动应用。其中之一是使用带有来自环境变量CXXFLAGS的标志的C ++编译器从'file.cpp'中创建'文件'。这有点像你想要的......
答案 1 :(得分:4)
您可以拥有以下目标
.cpp:
g++ -W -Wall $@.cpp -o $@
这会创建一个隐式规则,这意味着要生成文件x
已存在的文件x.cpp
,请执行以下操作。
当你有规则时,你可以从命令行执行此操作:
make file
make file2
答案 2 :(得分:3)
依赖于make的C ++默认规则,makefile只需要
CPPFLAGS ?= -W -Wall
然后在命令行:
make file1
make file2
rm file2
make file2 CPPFLAGS="-W -Wall -O3"
rm file2
make file2 CXXFLAGS="-O3" # possibly a bit too cunning, this one
# It has the same effect as the one with CPPFLAGS
就个人而言,我会添加到makefile
EXECUTABLES = file1 file2
all: $(EXECUTABLES)
clean:
rm -f $(EXECUTABLES)
答案 3 :(得分:1)
%: %.cpp
g++ -W -Wall $*.cpp -o $*
答案 4 :(得分:1)
只需使用以下行创建一个Makefile
CXXFLAGS=-W -Wall
您现在可以拨打电话。
make foo
它会自动查找“foo.cpp”文件。
答案 5 :(得分:0)
Makefile
不打算作为脚本工作;采取特定的投入来产生特定的产出。相反,它描述了文件之间的依赖关系,以及如何构建任何依赖关系,以便达到特定目标。
虽然可以通过创建名为“file1”的目标和名为“file2”的目标来执行您要求的操作,但这不是Makefile
s背后的想法;如果这是你的要求,你可能会更好地使用shell脚本。
答案 6 :(得分:0)
您可以运行 make prog#来构建相应的程序。
CXX=/usr/bin/g++
CXXFLAGS=-W -Wall
TARGETS=prog1 prog2 prog3
all: $(TARGETS)
prog1: prog1.cpp
$(CXX) $(CXXFLAGS) prog1.cpp -o prog1
prog2: prog2.cpp
$(CXX) $(CXXFLAGS) prog2.cpp -o prog2
prog3: prog3.cpp
$(CXX) $(CXXFLAGS) prog3.cpp -o prog3