在makefile中使用命令行输入

时间:2019-10-30 01:55:49

标签: c++ makefile compilation

我目前有一个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创建的二进制文件。输入的文件名不能被硬编码。

3 个答案:

答案 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"