C ++ make-файл с относительным включением пути к родителю - PullRequest
0 голосов
/ 20 января 2020

У меня есть рабочий проект, который мне нужно взять из него без изменения кода и просто написать для него новый main (). Моя структура каталогов:

[main_dir] / [main.cpp]

[main_dir] / [dir1] / [child1] /file1.h

[main_dir] / [dir2] / [child2] /file2.h

в основном. cpp У меня есть: include «dir1 / child1 / file1.h»

В file1.h у меня есть: include "dir2 / child2 / file2.h"

Я собираю: g ++ main main. cpp

Я получаю "dir2 / child2 / file2.h" такого файла нет или каталог. Я не могу изменить file1, чтобы сделать: include "../../dir2/child2/file2.h"

Каким-то образом в исходном проекте что-то в make-файле для поиска всех путей включения относительно [ main_dir], поэтому можно найти файл include из file1.h.

Что мне добавить в make-файл, чтобы сделать это тоже?

Ответы [ 2 ]

1 голос
/ 20 января 2020

При использовании двойных кавычек для включения файла заголовка, как в

#include "dir2/child2/file2.h"

, компилятор будет использовать каталог текущего файла для поиска для файла заголовка.

Если он есть в вашем file1.h, то компилятор будет искать файл заголовка [main_dir]/dir1/child1/dir2/child2/file2.h. Что не правильно.

Вы можете решить эту проблему, сказав компилятору добавить [main_dir] в список стандартных путей поиска для включения. Это делается с помощью опции -I (в верхнем регистре i):

g++ -I [main_dir] main.cpp

Затем, когда компилятору не удается найти dir2/child2/file2.h при первом поиске, он продолжит работу со списком стандартного поиска включения. пути, и это должно быть найдено.

1 голос
/ 20 января 2020

Вам нужно управлять CPPFLAGS в вашем Makefile.

CPPFLAGS="-I[main_dir]"

и скомпилировать приложение с квитанцией, как это:

g++ $(CPPFLAGS) main.cpp -o main

Также рекомендуется прочитать руководства по стилю make написать хороший Makefile. Вы можете встретить там советы по включению папки.

...