簡體   English   中英

從 Makefile 中的 $@ 獲取文件名

[英]Get filename from $@ in Makefile

當所有 cpp 文件都在一個目錄中時,這個 makefile 工作得很好。 創建子目錄時,它無法創建 *.o 文件,因為它缺少子目錄:

目錄結構

.
├── Makefile
├── README.md
├── src
│   ├── Adventurer
│   │   └── Adventurer.cpp
│   ├── Board
│   │   ├── AdventureTile.cpp
│   │   └── Board.cpp

生成文件

CC := g++ # This is the main compiler
SRCDIR := src
BUILDDIR := build
TARGET := bin/forbidden-island
 
SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
CFLAGS := -g -Wall
LIB := -lsfml-graphics -lsfml-window -lsfml-system 
INC := -I include


$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
# BUILDPATH=$($(BUILDDIR)/%.o) # missing step of creating subdirectories 
# OFILE=$(basename $@)
    @mkdir -p $(BUILDDIR)
    @echo " $(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<

此代碼的示例輸出是:

 g++  -g -Wall -I include -c -o build/Board/Board.o src/Board/Board.cpp
 src/Board/Board.cpp: In member function ‘AdventureTile Board::getTile(int, int)’:
 src/Board/Board.cpp:13:1: warning: no return statement in function returning non-void [-Wreturn-type]
}
^
Assembler messages:
Fatal error: can't create build/Board/Board.o: No such file or directory
Makefile:23: recipe for target 'build/Board/Board.o' failed
make: *** [build/Board/Board.o] Error 1

如何更改命令,使其只是 o 文件的名稱而不是完整路徑。 使用特殊變量 $@。

(basename $@)返回build/Board/Board但需要它是 board.o

============== 解決方法==============

Makefile 失敗,因為未創建子目錄。 @mkdir -p $(BUILDDIR)需要變成@mkdir -p $(dir $@)來解決這個問題。

我真的不明白你的意思是如何更改命令以使其只是 o 文件的名稱......哪個命令?

創建一個不完全是$@值的文件的配方是不正確的。 這就是 make 期望您創建的內容,如果您的配方創建了其他文件,則事情將無法正常工作。

在任何情況下,GNU make 支持的功能都可以在這里使用 你想要的是$(notdir $@) 但是,您甚至不需要它,因為目錄( $(@D) )和文件( $(@F) )有自動變量的變體。

暫無
暫無

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

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