Intereting Posts

g ++ компилировать исходные файлы, существующие в другом каталоге

Я пытаюсь настроить процесс сборки с помощью 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