Я пытаюсь настроить процесс сборки с помощью make-файлов, для плагина C ++, над которым я работаю. Мне интересно узнать, есть ли способ сделать g ++ компилировать исходные файлы, найденные в другом каталоге. Моя мотивация для этого заключается в том, чтобы не указывать относительный путь для каждого исходного файла, как я объясняю ниже.
Структура моего проекта выглядит так:
MyPlugin --> src --> Foo.cpp --> Foo.h --> Bar.cpp --> Bar.cpp --> build --> Makefile
Ниже приведена урезанная версия моего текущего файла Makefile:
SRC_PATH=../src OUT_PATH=../bin VPATH=${SRC_PATH} FILES=Foo.cpp Bar.cpp CC=g++ CFLAGS=-Wall -shared all: mkdir -p ${OUT_PATH} ${CC} ${CFLAGS} -I${SRC_PATH} ${FILES} -o ${OUT_PATH}/MyPlugin.so
Делая это, я пытаюсь избежать определения переменной FILES
как FILES
ниже:
FILES=../src/Foo.cpp ../src/Bar.cpp
Когда я попытался запустить make all
, g ++ дал мне ошибку. Похоже, что путь, указанный через флаг -I
используется только для поиска файлов #include
d.
g++: Foo.cpp: No such file or directory g++: Bar.cpp: No such file or directory
Я не могу использовать подстановочные знаки ( *.cpp
), потому что я не всегда хочу, чтобы все файлы были собраны для компиляции. Другой альтернативой является cd
в каталоге src, как упоминалось здесь , и запускать g ++ оттуда, но это работает только для меня, если все файлы находятся в одном каталоге (мне нужен вывод как один .so
файл). Я также попытался установить переменную среды PATH
, но это, похоже, не имело никакого эффекта.
Я просмотрел справочную систему g ++, документацию по make и посмотрел сообщения StackOverflow, такие как https://stackoverflow.com/questions/10010741/g-compile-with-codes-of-base-class-in-a-separate -directory и gcc / g ++: «Нет такого файла или каталога» , но не смог найти решение, которое я мог бы использовать. Не могли бы вы предложить мне подходящий подход к этой проблеме?
Редактировать Пример может быть введен в заблуждение. В этом урезаном примере у меня есть все исходные файлы в одном каталоге, но в моем фактическом проекте у меня есть несколько подкаталогов и несколько файлов в каждом каталоге. Таким образом, хотя cd
ing в каталоге src
работает в моем примере выше, он не будет работать в моем фактическом проекте (или, по крайней мере, я хотел бы знать, как он будет работать).
Вы можете иметь вторую переменную для фактических исходных файлов, например:
FILES = Foo.cpp Bar.cpp SOURCES = $(FILES:%.cpp=$(SRC_PATH)/%.cpp)
Затем вместо использования FILES
при построении используются SOURCES
.
Если вы посмотрите на вывод Make на своей консоли, вы увидите это как показано ниже:
g++ -Wall -shared -I../src Foo.cpp Bar.cpp -o ../bin/MyPlugin.so
Как вы видите, путь к скомпилированным файлам неверен. Вы уже упоминали об одном способе достижения этого, путем префикса исходных имен файлов с помощью ../src (в чем проблема с этим подходом). Или вы можете определить FILES как показано ниже:
FILES=${SRC_PATH}/Foo.cpp \ ${SRC_PATH}/Bar.cpp
Используя вышеописанный метод, вам не нужно вручную редактировать исходный путь, который должен измениться.
Вы можете поместить все исходные каталоги кандидатов в VPATH следующим образом:
VPATH=${SRC_PATH}:other_source_dir1:other_source_dir2
Тогда, когда g ++ нужен исходный файл, make будет искать исходный файл по VPATH.
И попробуйте сделать список файлов .cc в списке .o:
FILES = file1.o file2.o
И добавьте следующие две строки в ваш файл make. Обратите внимание: вторая строка должна начинаться с TAB.
.cc.o: $(CC) $(CFLAGS) -c $< # NOTE This should begin with TAB