我目前有一个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,以便可以make <file_name>
使makefile运行可执行文件,而不必使用已经拥有的make创建的二进制文件。输入的文件名不能被硬编码。
答案 0 :(得分:0)
尝试以下简单示例:
a : a.c
gcc a.c -o a.o
./a.o
b : b.c
gcc b.c -o b.o
./b.o
当您运行“ make a”(也可以执行)时。 “ make b”,b.o可执行文件。
答案 1 :(得分:0)
通常,您在要创建的目标(例如make interpreter
)上调用make,而不是在输入文件(make不知道如何生成)上调用make。解决此问题的一种常用方法是定义一个(基于规则的)执行代码的目标。例如.res(结果为'.res')。目标将运行程序,并将输出保存到.res
文件中。
您将使用make input_file_name.res调用目标
%.res: % interpreter
interpreter $< > $@
在运行此目标之前,请注意显式依赖项来构建解释。
有关$<
(输入文件)和$@
(输出文件)的更多信息,请参见使'explicit'变量
答案 2 :(得分:0)
不要尝试使make接受要构建的目标以外的参数。
代替创建脚本:
function setup() {
createCanvas(windowWidth, windowHeight);
background(0);
noLoop();
}
function draw() {
translate(width /2, height /2);
stroke(255);
strokeWeight(1);
line(0, height, 0, -height)
line(width, 0, -width, 0)
for (var y = 250, x = 0; y >= 0; y-=50, x+=50) {
line(0, y, x, 0)
}
for (var y1 = -250, x1 = 0; y1 <= 0; y1+=50, x1+=50) {
line(0, y1, x1, 0)
}
for (var y2 = 250, x2 = 0; y2 >= 0; y2-=50, x2-=50) {
line(0, y2, x2, 0)
}
for (var y3 = -250, x3 = 0; y3 <= 0; y3+=50, x3-=50) {
line(0, y3, x3, 0)
}
}
并使用参数运行:
#! /bin/sh
# rebuild if necessary
make
# run interpreter with arguments
interpreter "$@"
有关更多原因的解释,以及makefile黑客行为的警告,请阅读我对另一个类似问题的回答:Passing arguments to "make run"