Почему код не может быть собран при изменении исходного местоположения в Makefile? - PullRequest
0 голосов
/ 26 апреля 2020

У меня проблема с созданием файлов cpp, когда я перемещаю их из папки Makefile. Кто-нибудь знает почему?

Фрагмент из файла makefile:

CC = qcc -Vgcc_nto$(PLATFORM)
CXX = qcc -lang-c++ -Vgcc_nto$(PLATFORM)
LD = $(CXX)
DEPS = -Wp,-MMD,$(@:%.o=%.d),-MT,$@
CFLAGS=-Wall -g -ggdb -O0 
DIR_SRC =./
DIR_OBJ =./
SRCS := $(wildcard $(DIR_SRC)/*.cpp)
OBJECTS := $(SRCS:$(DIR_SRC)/%.cpp=$(DIR_OBJ)/%.o)

all: hello_world_test 

$(DIR_OBJ)/%.o : $(DIR_SRC)/%.c
     $(CXX) $(CFLAGS) ${CPPFLAGS} ${DEPS} -c $< -o $@

hello_world_test:  hello_world_test.o
     $(CXX) hello_world_test.o $(LDFLAGS) $(LIBPATH) $(LDLIBS) -o $@

Таким образом, все в порядке, но когда я перемещаю исходники в одну папку, называемую "test"

DIR_SRC =../test

это больше не работает с сообщением:

make: *** Нет правила для создания цели 'hello_world_test.o', необходимой для 'hello_world_test'. Стоп.

Ответы [ 3 ]

1 голос
/ 26 апреля 2020

Потому что:

hello_world_test: hello_world_test.o

ваш hello_world_test зависит от hello_world_test.o. Но ваше правило говорит make, как построить $(DIR_OBJ)/%.o, а hello_world_test.o не соответствует этому шаблону. Сопоставление с образцом в целях - это простое сопоставление строк, оно не упрощает пути. Вы должны написать свое предварительное условие как:

hello_world_test: $(DIR_OBJ)/hello_world_test.o

Обратите внимание, что у вас есть две косые черты: одна в DIR_OBJ и одна после нее. Но в любом случае.

Причина, по которой он работал раньше, заключается в том, что make использует встроенный рецепт для создания объектных файлов, а не ваш рецепт; встроенный рецепт имеет шаблон:

%.o : %.c

, который соответствует вашему объектному файлу. Если вы запустите make с опцией -r, чтобы удалить все встроенные правила, вы также увидите там ошибку.

0 голосов
/ 27 апреля 2020

Я понял, в чём была проблема:

Я не добавил $ (DIR_OBJ) /hello_world_test.o в $ (CXX) hello_world_test.o $ (LDFLAGS) $ (LIBPATH) $ (LDLIBS) - o $ @

, но теперь все еще в замешательстве, если я правильно понимаю, что $ (DIR_OBJ) /%. o: $ (DIR_SR C) /%.cpp создаст $ (DIR_OBJ) / hello_world_test . Почему же hello_world_client: $ (DIR_OBJ) /hello_world_client.o не удалось найти необходимое условие?

0 голосов
/ 27 апреля 2020

Спасибо за ваш ответ. Я узнал, что проблема была в правиле, как вы сказали. Я изменил на $ (DIR_OBJ) /%. O: $ (DIR_SR C) /%.cpp (до этого было. c вместо. cpp :)), и теперь он работает с изменением DIR_SR C. Я не наблюдал этого, поскольку смог собрать из текущего каталога, но понял после вашего ответа о встроенном правиле.

Другие вопросы: 1) Имеет ли это правило: $ (DIR_OBJ) /%. O : $ (DIR_SR C) /%.cpp $ (CXX) $ (CFLAGS) $ {CPPFLAGS} $ {DEPS} - c $ <-o $ @ </p>

говорит следующее: делать скомпилируйте все. cpp файлы и создайте из него файлы .o и поместите файлы .o в DIR_OBJ?

2) Почему я не могу изменить местоположение DIR_OBJ, например: DIR_OBJ = .. / test, а затем использовать hello_world_test: $ (DIR_OBJ) /hello_world_test.o для сборки исполняемого файла?

Когда я это делаю, я получаю сообщение об ошибке: не могу найти hello_world_test.o: нет такого файла или каталога.

I обратите внимание, что файлы .o и .d создаются в каталоге, в котором определен DIR_OBJ (либо в ./, либо в ../test), а затем меня несколько смущает, почему hello_world_test не может выполнить прекрасную предпосылку $ (DIR_OBJ) /hello_world_test.o, но он смотрит только в текущей папке, где находится Makefile.

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