У меня есть приложение на c ++, которое разделено на модули. Структура каталогов для каждого модуля выглядит следующим образом:
module_a/
export/ <-- module_a public interface
src/ <-- module_a private source
test/
src/ <-- unittests for module_a
Я использую CMake для настройки зависимостей модуля и для сборки приложения. Если module_a
зависит от module_b
, то каталог module_b
export
добавляется в качестве пути включения при сборке module_a
.
Итак, если есть файл module_b/export/foo.h
, то module_a
Затем необходимо в исходном файле использовать #include "foo.h"
.
Я ищу способ сделать так, чтобы имя модуля было частью директивы include. Поэтому для приведенного выше примера я хочу (должен) написать #include "module_b/foo.h"
.
Это можно сделать с помощью опций GCC -iprefix и -iwithprefix? Я искал примеры использования, но все, что я могу найти, это копии и ссылки на руководство GCC, которое, я думаю, не очень хорошо объясняет это.
Я пытался использовать его таким образом:
$ find -type f
./src
./src/main.cc
./export
./export/bar.h
$ g++ -iprefix foo/ -iwithprefix export/ src/main.cc
src/main.cc:1:10: fatal error: foo/bar.h: No such file or directory
1 | #include "foo/bar.h"
| ^~~~~~~~~~~
compilation terminated.
$ gcc --version
gcc (Debian 9.2.1-17) 9.2.1 20191102
Но, как видите, это не работает. Как использовать -iprefix и -iwithprefix?
Кроме того, у кого-нибудь есть другое решение моей проблемы? Я немного обеспокоен тем, что IDE и другие компиляторы могут не понимать -iprefix и -iwithprefix, поэтому любые другие решения также приветствуются.
Редактировать: после публикации этого вопроса я сразу понял, что, возможно, -iprefix foo/ -iwithprefix bar
просто необычный способ написания -I foo/bar
. Однако, я проверил это, и я все еще не заставил это работать. Поэтому было бы хорошо, если бы кто-то мог объяснить, как работают эти опции, даже если они не помогут мне в моей проблеме.