Заголовочный файл Xcode 4 C с относительным путем к другому заголовку

#c #xcode #macos #xcode4

#c #xcode #macos #xcode4

Вопрос:

Я использую библиотеку со структурой включения, где все файлы .h находятся в одном каталоге. Эти файлы .h содержат единственную строку, #include директиву, которая указывает на «реальный» файл заголовка в определенных местоположениях исходной папки. #include Путь в этих файлах относительный.

Итак, вот пример. Структура каталогов такова:

 /project
     /sources 
         <my .cpp files>
         <my .cpp files>
         ...
     /include
         /component
             foo1.h
             foo2.h
     /platformA/something/foo1.h
     /platformB/somethingelse/foo2.h
  

/include/component/foo1.h содержит одну строку кода:
#include "../platformA/something/foo1.h"

/include/component/foo2.h содержит единственную строку кода #include "../platformB/somethingelse/foo2.h"

В моих источниках у меня просто есть: #include "component/foo1.h"

Путь поиска заголовка для моего проекта указывает на /include

Теперь Xcode 4 может найти component/foo1.h в /include , но он не может следовать относительному пути включения в этих заголовках и найти «реальный» foo1.h в каталоге `/ platformA / something’ и так далее.

Я подозреваю, что это потому, что пути включения в файле foo1.h верхнего уровня относятся к его местоположению, но Xcode может рассматривать его как относящийся к какому-либо другому местоположению (корень проекта или что-то в этом роде)? Черт возьми, у Visual Studio нет проблем с идентичной конфигурацией.

Что я могу сделать, чтобы исправить это?

Ответ №1:

Из вашей структуры каталогов кажется, что каталоги platformA и platformB размещены за пределами включаемой папки. Для этого есть два возможных решения:

Решение A

Переместите их в include папку.

Решение B

Добавьте project/platformA и project/platformB в directories where include files
should be looked for
в настройках проекта.

Комментарии:

1. Я понял, что в своей попытке упростить я упустил несколько вещей. Я обновил пример, чтобы он был более реальным. В моих исходных текстах я хотел бы #include "component/foo1.h" , поэтому ваше предложение переместить материал во включаемую папку на самом деле не сработает (это было бы в моем неправильно упрощенном примере — извините за это).

2. Затем вы можете проверить второе решение, которое я предложил.

Ответ №2:

Не используйте относительные пути. Серьезно, то, как они работают, определяется реализацией, поэтому разные компиляторы / среды / платформы будут вести себя по-разному, и в вашем случае Xcode почти наверняка вызывает GCC или clang в каком-то каталоге «build», который может быть или не быть родственным вашему каталогу sources.

Это не стоит головной боли.

Поместите platformA и platformB в include или добавьте другой каталог (скажем, platform-include ) поместите их туда и добавьте этот каталог к вашему пути включения.

Комментарии:

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

2. @psychotik: Неважно, это на самом деле не соответствует тому, что вы говорили, извините.