Как #включить файлы в отдельные каталоги, используя разные IDE?

Я работаю над проектом C++, используя Xcode в MacOS X, и теперь начинаю портировать его на Linux, используя IDE Code::Blocks.

Многие из моих исходных файлов находятся в отдельных каталогах, и у меня возникают проблемы с их включением.

Вот пример этой проблемы:

folder1/foo.h

folder2/dog.h

foo.h includes dog.h with: `#include "dog.h"`

Он отлично работает в Xcode, если оба файла находятся в одном проекте, но если я попробую его в Code::Blocks, у него будет ошибка при его обнаружении.

Я могу исправить эту проблему в Code::Blocks, изменив код, чтобы использовать относительный путь включения, например:

#include "../folder2/dog.h"

К сожалению, это мешает Xcode найти файл.

Как я могу решить эту проблему, чтобы я мог скомпилировать один и тот же код в нескольких IDE? Я хотел бы не бросать все исходники в одну папку. Должен ли я использовать оператор препроцессора, подобный:

#if XCODE
#include "dog.h"
#else
#include "../folder2/dog.h"
#endif

person Justin Meiners    schedule 18.12.2011    source источник
comment
Перейдите в параметры Code::blocks и установите включаемые каталоги.   -  person Lalaland    schedule 18.12.2011
comment
@EthanSteinberg, как только это будет настроено, смогу ли я напрямую включить файл, например #include dog.h ?   -  person Justin Meiners    schedule 18.12.2011
comment
Ага. Это один из основных моментов настройки включаемых каталогов.   -  person Lalaland    schedule 18.12.2011
comment
@Dmitri Это не так. Я думаю, что он копирует все заголовки из проекта в один каталог и компилирует там форму.   -  person Justin Meiners    schedule 18.12.2011


Ответы (2)


Измените свою структуру так, чтобы у одного проекта был только один общий каталог включения:

/project/
        /src/*.cpp
        /include/*.hpp
                /folder1/dog.hpp
                /folder2/cat.hpp

Теперь скажите #include <config.hpp> и #include <folder1/dog.hpp> и т. д. и добавьте к флагам вашего компилятора:

-I ${PROJECT_DIR}/include
person Kerrek SB    schedule 18.12.2011
comment
Что, если вы хотите, чтобы заголовочные файлы располагались рядом с соответствующими им исходными файлами? Что делать, если в среде IDE нет параметра -I? - person Oliver Charlesworth; 18.12.2011
comment
@Oli у любой приличной IDE будет какой-то способ указать, где искать включаемые заголовочные файлы. Если явно не поддерживается, просто добавьте его как дополнительные переключатели компилятора вручную. - person greatwolf; 18.12.2011
comment
+1 за реструктуризацию исходных файлов. Я обычно так и поступаю, и этому соглашению следуют многие проекты с открытым исходным кодом. - person greatwolf; 18.12.2011
comment
@OliCharlesworth: Если IDE не позволяет вам настраивать флаги компилятора для каждого проекта, я бы сказал, что пришло время сменить IDE! - person Kerrek SB; 18.12.2011
comment
@Kerrek: Действительно. Но ОП, похоже, спрашивает, есть ли способ сделать это независимо от какой-либо конкретной IDE. - person Oliver Charlesworth; 18.12.2011

То, как конкретный компилятор/IDE находит зависимости, к сожалению, полностью зависит от компилятора/IDE. Невозможно организовать это таким образом, чтобы оно соблюдалось всеми средами разработки.

Я не знаю Xcode или Codeblocks, но я уверен, что должна быть какая-то конфигурация проекта, которая контролирует, где они ищут файлы #include.

person Oliver Charlesworth    schedule 18.12.2011
comment
Итак, вы бы порекомендовали включить все папки, настроив пути включения для IDE? - person Justin Meiners; 18.12.2011
comment
@Justin - в других IDE также есть возможность добавлять файлы в проект. В этом случае он работает так же, как в Xcode. Если нет, вы, вероятно, можете добавить список включаемых каталогов. - person Bo Persson; 18.12.2011