我目前有一个makefile,运行时它将链接.h和.c文件,然后创建一个二进制文件。是否可以通过仅在make之后执行输入file_name来使makefile执行此二进制文件?
我的makefile看起来像这样:
CC = g++
cppflags = "-std=c++0x"
all : interpreter
byte.o : opcode.h byte.h byte.cpp
$(CC) -c $(cppflags) byte.cpp
interpreter : byte.o main.cpp
$(CC) $(cppflags) byte.o main.cpp -o interpreter
[如果执行make
,我将获得以输入文件名作为参数的可执行文件interpreter
。我想做的是修改我的Makefile,以便可以使Makefile运行可执行文件,而不必使用已经拥有的Make创建的二进制文件。输入的文件名不能被硬编码。
尝试这个简单的例子:
make <file_name>
当您运行“ make a”时,也可以执行。 “ make b”,b.o可执行文件。
通常,您在要创建的目标(例如 a : a.c
gcc a.c -o a.o
./a.o
b : b.c
gcc b.c -o b.o
./b.o
)上调用make,而不是在输入文件(make不知道如何构建)上调用make。解决此问题的一种常用方法是定义一个(基于规则的)执行代码的目标。例如.res(结果为'.res')。目标将运行程序并将输出保存到make interpreter
文件。
您将使用make input_file_name.res调用目标
.res
请注意在运行此目标之前要显式依赖构建解释。
有关%.res: % interpreter
interpreter $< > $@
(输入文件)和$<
(输出文件)的更多信息,请参见使“显式”变量。
不要尝试使make接受要构建的目标以外的参数。
代替创建脚本:
$@
并使用参数运行:
#! /bin/sh
# rebuild if necessary
make
# run interpreter with arguments
interpreter "$@"
有关详细说明,为什么这样做和makefile黑客的注意事项读了我对另一个类似问题的回答:$ ./buildtheninterpret.sh filenametointerpret