簡體   English   中英

如何正確地使我的makefile編譯和運行?

[英]How to properly make my makefile to compile and run?

問題可能不是描述我的問題的最佳問題,但我想不出更好的問題。 我的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)

當我想編譯並運行時,我只是做“運行”。 這個問題是我的程序處理Ctrl + Z產生的信號,如果我用“make run”啟動我的程序,信號將被發送到“make run”而不是我的程序本身。

基本上,調用“make run”與直接調用“make && ./prog”不同,因為在第一種情況下,“make run”不會終止,除非“prog”首先終止。

有沒有解決的辦法?

您可以通過依賴於程序是否是最新的來簡化“運行”目標,然后只需運行程序:

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

這里沒有太多運行點make ,當你已經運行make -至少,在此背景下。 也許對於遞歸操作(在不同的目錄中),但請參閱' Recursive Make Considered Harmful '。

此外,你的makefile通常應該提供一個目標' all ',它通常應該是第一個默認目標。

從makefile運行有點不尋常。 您是否可能嘗試復制某些IDE提供的“編譯和運行”菜單項? Make沒有那么好的裝備。

目標命令中發生的所有事情都發生在沒有直接連接到終端的子進程中,這就是make接收鍵擊的原因。

另一件需要注意的事情是:通常對象文件到可執行階段(鏈接)使用不同的標志集( LDFLAGSLIBS )然后是編譯階段。 在這個簡單的例子中,你可以逃脫它,但如果你復制這個makefile以便在更復雜的情況下使用,你將遇到麻煩。

如果您要構建並反復運行,可以使用history命令來幫助解決此問題:

# Run this once
make && ./foo

# Repeat last command
!!

正如dmckee的回答所說,make(1)正在創造一些東西,而不是為了編譯和運行。

當然,沒有什么能阻止你創建一個shell別名make-run來完成預期的' make && ./prog args '。

你可以嘗試這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM