Получить имя файла из $ @ в Makefile - PullRequest
0 голосов
/ 22 декабря 2019

этот make-файл прекрасно работает, когда все файлы cpp находятся в одном каталоге. при создании подкаталогов он не может создать файлы * .o, потому что отсутствуют его подкаталоги:

Структура каталогов

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

Makefile

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 $@ $<

пример вывода этого кодаis:

 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 $@), чтобы исправить это.

1 Ответ

0 голосов
/ 22 декабря 2019

Я не совсем понимаю, что вы подразумеваете под , как можно изменить команду так, чтобы это было просто имя o файла ... какая команда?

Это не такисправьте рецепт, чтобы создать файл, значение которого не равно $@. Это то, что make ожидает от вас, и все будет работать некорректно, если ваш рецепт создаст какой-то другой файл.

В любом случае функции, поддерживаемые GNU make, доступны здесь . Тот, который вы хотите, это $(notdir $@). Однако вам это даже не нужно, потому что есть варианты автоматических переменных для каталога ($(@D)) и файла ($(@F)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...