Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Makefile для отдельных каталогов src и bin

#g++ #make


Существует дерево файлов:

folder
|-src
  |-myfile.cpp
  |-myfile.h
|-bin
|-Makefile


Хочу написать Makefile так, чтобы компилировались файлы, находящиеся в каталоге src,
но объектные файлы создавались в текущем (в folder). А потом, чтобы они линковались
в один файл в каталог bin.

На данный момент имею нерабочий Makefile. Ругается на отсутствие правила для myfile.o.

TARGET=myfile
OBJECTS=myfile.o
XX=g++
CXXFLAGS=-std=c++11

all: ${TARGET}
${TARGET}: ${OBJECTS}
    ${XX} -o ${TARGET} ${OBJECTS}
.c.o:
    ${XX} ${CXXFLAGS} -c "${INCLUDE}$<" -o "$@"


Как правильно реализовать поставленную задачу?
    


Ответы

Ответ 1



чтобы они линковались в один файл в каталог bin значит, собирать вам надо не myfile, а bin/myfile. это я про переменную TARGET. объектные файлы создавались в текущем так и укажите цель и пререквизиты соответствующим образом: %.o: src/%.cpp $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $(OUTPUT_OPTION) $< здесь вторая строка, рецепт, взята из implicit rules, которые можно посмотреть в выводе команды make -p остаётся только объяснить компилятору, где искать заголовочный файл myfile.h (если, конечно, компилятор сам не «догадается»). тут я, как не-программист, вряд ли чем помогу. разве что предположу, что надо добавить к значению перменной CPPFLAGS или CXXFLAGS опцию -I src.

Ответ 2



Gnu make имеет интересную директиву vpath, которая позволяет указать где искать те или иные исходники. В вашем случае достаточно добавить в начало Makefile: vpath %.cpp src vpath %.h src CXXFLAGS+=-Isrc И implicit rules тогда можно не переписывать.

Комментариев нет:

Отправить комментарий