20

この質問はおそらく私の問題を説明するのに最適な質問ではありませんが、これ以上の質問は考えられませんでした。私のmakefileは次のようになります:

PROGRAM_NAME = prog

OBJECT_FILES = $(PROGRAM_NAME).o
CFLAGS = -O2 -Wall -g

$(PROGRAM_NAME) : $(OBJECT_FILES)
    gcc $(CFLAGS) -o $@ $(OBJECT_FILES)

$(PROGRAM_NAME).o : $(PROGRAM_NAME).c data.h
    gcc $(CFLAGS) -c $<

clean :
    $(RM) $(PROGRAM_NAME)
    $(RM) $(OBJECT_FILES)
    $(RM) *~ *.bak

run :
    @$(MAKE) && ./$(PROGRAM_NAME) $(ARGS)

コンパイルして実行したいときは、「makerun」を実行します。これに関する問題は、私のプログラムがCtrl + Zによって生成された信号を処理し、「make run」でプログラムを開始すると、信号はプログラム自体ではなく「makerun」に送信されることです。

基本的に、「make run」を呼び出すことは、「make && ./prog」を直接呼び出すことと同じではありません。最初のケースでは、「prog」が最初に終了しない限り、「makerun」は終了しません。

これを回避する方法はありますか?

4

5 に答える 5

19

プログラムが最新であるかどうかに依存させることで、「実行」ターゲットを単純化してから、プログラムを実行するだけです。

run:    ${PROGRAM_NAME}
        ./${PROGRAM} ${ARGS}

makeすでに実行している場合は、実行してもあまり意味がありませんmake。少なくとも、このコンテキストではそうではありません。(異なるディレクトリでの)再帰操作の場合もありますが、「再帰的に有害と見なされる」を参照してください。

また、makefileは通常、ターゲット' all'を提供する必要があり、通常は最初の、したがってデフォルトのターゲットである必要があります。

于 2009-05-24T16:37:03.657 に答える
17

makefileから実行するのは少し珍しいです。おそらく、一部のIDEが提供する「コンパイルして実行」メニュー項目を複製しようとしていますか?Makeはそれを行うための設備が整っていません。

ターゲットコマンドで発生するすべての処理は、端末に直接接続されていないサブプロセスで発生します。そのため、makeはキーストロークを受け取ります。

もう1つの注意点:通常、オブジェクトファイルから実行可能ステージ(リンク)は、コンパイルステージとは異なるフラグのセット(LDFLAGSおよび)を使用します。LIBSこの単純な例では、それを回避することができますが、より複雑なケースで使用するためにこのmakefileをコピーすると、問題が発生します。

于 2009-05-24T15:36:05.413 に答える
4

ビルドして何度も実行する場合は、次のhistoryコマンドを使用してこれを支援できます。

# Run this once
make && ./foo

# Repeat last command
!!
于 2013-03-08T04:14:10.087 に答える
3

dmckeeの答えが言ったように、make(1)はコンパイルして実行するためではなく、何かを作っています。

もちろん、意図した' make &&./progargs 'を実行するシェルエイリアスmake-runを作成することを妨げるものは何もありません。

于 2009-05-24T16:04:47.530 に答える
2

あなたはこのように試すことができます:

APP      = olupxtest

SRCS     = $(wildcard *.cpp)
OBJS     = $(SRCS:.cpp=.o)

CXXFLAGS = -g -fPIC -c
LDFLAGS  =
LIBS     =

.PHONY: all clean

all: clean $(APP) run

$(APP): $(OBJS)
        $(CXX) $(LDFLAGS) $^ $(LIBS) -o $@

clean:
        $(RM) $(OBJS) $(APP)

run:    ${APP}
        ./${APP} ${ARGS}

ここでは、ターゲットに対して複数のルールを呼び出しています。all: clean $(APP) run

于 2019-08-06T08:02:25.887 に答える