включая файл .h из другого каталога application / - PullRequest
2 голосов
/ 05 декабря 2009

У меня есть несколько .h файлов следующим образом (в Linux)

Source/Server/connect.h
Source/Server/message.h
...

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

Source/App2/..

Как я могу включить файл connect.h в приложение App2, учитывая, что я использую Perforce, и у всех, кто работает над приложением, будет своя собственная копия, поэтому добавление абсолютного пути к библиотеке включения может быть не очень хорошей идеей, но я не уверен.

EDIT: Я использую собственный механизм сборки для сборки кода, поэтому не смогу напрямую указать параметры gcc.

Ответы [ 5 ]

15 голосов
/ 05 декабря 2009

Вы можете #include относительный путь к файлам:

#include "../Server/connect.h"

или вы можете добавить флаг, чтобы указать компилятору искать в другом каталоге. Для gcc вы можете использовать -I../Server; для Visual C ++ вы можете использовать /I"../Server"; другие компиляторы, я уверен, имеют свои собственные флаги для этой цели.

Я думаю, что второе лучше в большинстве случаев, поскольку позволяет перемещать проекты, требуя только изменения пути включения в одном месте (make-файлы или таблицы свойств).

3 голосов
/ 05 декабря 2009

Как насчет добавления включаемого пути поиска в компилятор, для gcc это ключ -I.

2 голосов
/ 05 декабря 2009

Я предлагаю удалить пути из операторов #include. Как уже говорили другие, поместите пути в параметры к компилятору. Устраните различия в путях в makefile или используйте переменные среды (может потребоваться выполнить оба действия).

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

1 голос
/ 05 декабря 2009

Кроме статических относительных путей, вы также можете поиграть с препроцессором chicanery. Одна из техник, которые я видел в Adobe для кроссплатформенного кода, заключалась в следующем:

/* globalplatform.h */
#ifdef MAC
#define PLATFORM "../Platform/Mac/MacPlatform.h"
/* custom standard IO etc */
#define STDIO "../Platform/Mac/io/stdio.h"
#define CTYPE "../Platform/Mac/io/ctype.h"
#endif
#ifdef WIN32
#define PLATFORM "../Platform/Win/WinPlatform.h"
#define STDIO <stdio.h>
#define CTYPE <ctype.h>
#endif
/* etc */
#ifndef PLATFORM
#error undefined PLATFORM
#endif

/* some C file */
#include "globalplatform.h"
#include PLATFORM
#include STDIO
/* don't need CTYPE, no penalty */

Хотя проблема с платформой не является вашей проблемой, вы можете определить относительные пути на основе конфигурации сборки, если хотите, и изменения конфигурации происходят в одном месте, а не во многих, и клиентские файлы извлекают только то, что им нужно. Недостатком является то, что все инструменты, которые вы используете для просмотра файлов заголовков (щелчок правой кнопкой мыши и т. Д.), Скрыты.

0 голосов
/ 05 декабря 2009

Вы можете изменить директивы компилятора, как указано выше, или изменить путь в вашем коде (относительный или абсолютный).

Я бы посоветовал вам выбрать лучшие места для заголовков и объектных файлов (и библиотек) для всех ваших проектов и настроить их.

Если у вас есть стандартные местоположения include и lib, вы упростите разработку в будущем

...