#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: Неважно, это на самом деле не соответствует тому, что вы говорили, извините.