#c
#c
Вопрос:
У меня есть код, который должен быть общим для двух исполняемых файлов в одном проекте (одна команда сборки соберет их оба). Этот код содержит #ifdef
инструкции препроцессора, которые изменяют способ его работы в каждом проекте (определение макрокоманды командной строки используется в качестве переключателя).
Исходный код является абстрактным в том смысле, что некоторые заголовки отсутствуют. Например, общий файл Application.cpp
может включать файл с именем gui/MainWindow.h
, который не существует в общем каталоге, но существует в исходном каталоге исполняемого файла. Или это может включать файл с именем gui/Local.h
, который существует в общем каталоге.
По сути, мне нужно, чтобы gui
путь представлял собой комбинацию двух местоположений.
В unix я делал это раньше, просто устанавливая серию ссылок на файлы, но в этом проекте теперь в качестве целевого объекта используется Windows (Visual Studio). Кроме того, я знаю, как это сделать, используя структуру общих каталогов и установив переключатели включения компилятора, но я надеюсь, что есть более простой способ.
Есть идеи?
Я использую CMake для генерации сборки и GCC и Visual Studio в качестве компиляторов.
Я уже рассматривал определение каталога для препроцессора, но #include
директива, к сожалению, не может объединить несколько токенов для создания имени файла. Работает одно имя, и это может быть вариантом, когда cmake выдает макросы для всех общих имен файлов.
Ответ №1:
Я действительно думаю, что самое простое решение — использовать include paths — иметь разные пути для разных проектов. Посмотрите на таблицы свойств, чтобы поделиться настройками между проектами и значительно упростить управление.
Если вы используете ссылки на файлы в unix, вы могли бы сделать то же самое в Windows с символическими ссылками.
Комментарии:
1. Я знаю об этом методе, но в данном случае он кажется не совсем правильным. Это было бы огромным изменением / отклонением от текущей структуры каталогов проекта.
2. Я хотел бы надеяться, что вы могли бы сохранить структуру каталогов прежней и использовать включаемые пути для включения нужных каталогов таким же образом, как вы смотрите на использование #defines . Включение путей позволило бы вам иметь каталог «gui» для каждого проекта, а также общий каталог «gui» для всех проектов.
3. В настоящее время наша настройка представляет собой общий каталог include с вложенными папками,
include/lib
чтобы включить общий доступ, мне нужно было бы иметь такие каталоги, какinclude/exec_a/include/gui
, но тогдаexec_a
включать бессмысленно, и эта же структура должна повторяться и вsrc
каталоге. Я знаю, что это сработает, просто это не очень подходит для нашей текущей структуры каталогов.4. Вы могли бы использовать символические ссылки в Windows (требуется Vista или 7). Я обновил свой ответ.