Проблемы с неявным правилом в make - PullRequest
4 голосов
/ 22 февраля 2012

У меня следующая структура каталогов

         (root)
  /      /      \        \
/       |       |         \
src    obj  include     bin

Я бы хотел использовать неявное правило для компиляции всех файлов .cc в root\src до .o файлов в root\obj.

Пока это мой make-файл:

basedir = .
incl = ${basedir}\include
obj = ${basedir}\obj
src = ${basedir}\src
lib = ${basedir}\lib
bin = ${basedir}\bin

CXX = gcc

LDLIBS = -lstdc++ -lmingw32 -lSDLmain -lSDL -lSDL_image -lchipmunk -lSDL_ttf \
-lSDL_mixer

LDFLAGS = -L${lib}

objects = $(addprefix ${obj}\, GameObject.o PhysicalObject.o \
Terrain.o Timer.o main.o ImageLoader.o Player.o )

sources = $(addprefix ${src}\, GameObject.cc PhysicalObject.cc \
Terrain.cc Timer.cc main.cc ImageLoader.cc Player.cc )

Cyborg : ${objects}
    ${CXX} ${objects} -o ${bin}\Cyborg.exe -L${lib} ${LDFLAGS} ${LDFLAGS}

${obj}\%.o : ${src}\%.c
    ${CXX} ${src}\$^ -c -o ${obj}\$@ 

.PHONY: clean

clean :
    rm ${bin}\Cyborg.exe ${objects}

Я получаю ошибку make: *** No rule to make target .\obj\GameObject.o, needed by Cyborg. Stop.

Есть идеи, что не так? Я довольно плохо знаком с make-файлами, так что это может быть ужасно очевидно.

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Применяя все идеи из комментариев (и добавляя пару моих собственных тривиальных), мы получаем:

basedir = .
incl = ${basedir}/include
obj = ${basedir}/obj
src = ${basedir}/src
lib = ${basedir}/lib
bin = ${basedir}/bin

CXX = g++

LDLIBS = -lstdc++ -lmingw32 -lSDLmain -lSDL -lSDL_image -lchipmunk -lSDL_ttf \
-lSDL_mixer

LDFLAGS = -L${lib}

objects = $(addprefix ${obj}/, GameObject.o PhysicalObject.o \
Terrain.o Timer.o main.o ImageLoader.o Player.o )

sources = $(addprefix ${src}/, GameObject.cc PhysicalObject.cc \
Terrain.cc Timer.cc main.cc ImageLoader.cc Player.cc )

Cyborg : ${objects}
    ${CXX} ${objects} -o ${bin}/Cyborg.exe -L${lib} ${LDFLAGS} ${LDFLAGS}

${obj}/%.o : ${src}/%.c
    ${CXX} $^ -c -o $@ 

.PHONY: clean Cyborg

clean :
    rm -f ${bin}\Cyborg.exe ${objects}

Что делает "make Cyborg" с этим Makefile?

1 голос
/ 22 февраля 2012

Это, вероятно, займет несколько итераций.

Попробуйте несколько простых правил в порядке возрастания сложности и сообщите нам результаты:

./obj/GameObject.o : ./src/GameObject.cc
    @echo trying to build $@ from $<

./obj/GameObject.o : ./obj/%.o : ./src/%.cc
    @echo trying to build $@ from $<

$(objects) : ./obj/%.o : ./src/%.cc
    @echo trying to build $@ from $<

./obj/%.o : ./src/%.cc
    @echo trying to build $@ from $<
0 голосов
/ 22 февраля 2012
${obj}\%.o : ${src}\%.c --> ${obj}\%.o : ${src}\%.cc
0 голосов
/ 22 февраля 2012

У меня была похожая проблема с GNU make.Попробуйте создать правила explisit для ваших объектов:

$(obj)\GameObject.o: $(src)\GameObject.cc

$(obj)\PhysicalObject.o: $(src)\PhysicalObject.cc

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