Подтвердить что ты не робот

Использование внешних заголовков С++ в Objective-C

В моем проекте iOS мне нужно использовать внешнюю библиотеку, написанную на С++. Файлы заголовков С++ находятся в одном каталоге.

Я добавил эти заголовки С++ к моему проекту Xcode, а также указал путь поиска заголовка (в настройках сборки).

Проблема заключается в том, что эти заголовки С++ включают друг друга, используя < > угловые скобки. Это приводит к:

'filename.h' file not found with <angled> include, use "quotes" instead.

Странно, что Xcode не жалуется на все заголовки. Также тот же заголовок # include'd в одном файле прекрасен, а проблема, когда # include'd в другом. Я думаю, это связано с тем, что эти заголовки # включают друг друга.

  • Почему путь поиска не работает?
  • Есть ли способ разрешить это без изменения этих файлов заголовков?

Спасибо!

4b9b3361

Ответ 1

#include <bla.h>

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

#include "bla.h"

См. например

В качестве обходного пути вы можете установить для параметра Xcode build "Always Search User Paths" значение YES.

Ответ 2

Начиная с "пустого" проекта приложения:

  • Создайте папку "Библиотеки" в своем проекте приложения - предпочтительнее, как родной брат, в файл MyApp.xcodeproj, но он может быть где угодно. Создавайте вложенные папки для каждой конфигурации (Debug, Release и т.д.) И, возможно, для каждой архитектуры (armv7, armv7s, arm64), если только двоичный файл не является универсальным двоичным архивом, содержащим все архитектуры.

  • Получите заголовки сторонней библиотеки и бинарных файлов статической библиотеки (возможно, более одного для разных платформ, конфигураций и архитектур) и переместите их в папку "Библиотека" в соответствующие подпапки (которые вам могут понадобиться создать):

    Например, если у вас есть универсальная бинарная (armv7, armv7s, arm64) и Debug и Release версии этой библиотеки: Теперь предполагается, что структура папок выглядит следующим образом:

    $(SRCROOT)/Libraries
        Debug-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
        Release-iphoneos
            include
                ThirdParty
                    third_party.hh 
                    ...
            libThirdParty.a             
    MyApp.xcodeproj            
    
  • "Пути поиска в библиотеке" Настройка сборки:

    Перетащите папку "Библиотеки" в проект Xcode. Это может автоматически создать путь поиска библиотеки в настройках сборки. Проверьте это, и если это неверно, исправьте его.

    В этом примере добавьте следующие пути поиска библиотеки для Debug и Release Configuration:

    Отладка: Пути поиска библиотеки: $(SRCROOT)/Libraries/Debug-iphoneos

    Релиз: Пути поиска библиотеки: $(SRCROOT)/Libraries/Release-iphoneos

    У вас могут быть разные пути поиска библиотек для определенных пар настроений Configuration и Target. Соответственно установите другой путь в настройке сборки.

  • "Пути поиска заголовков" Настройка сборки:

    В этом примере добавьте следующий путь поиска заголовков в Debug и Release Configuration:

    Отладка: Контуры поиска заголовков: $(SRCROOT)/Libraries/Debug-iphoneos/include

    Релиз: Контуры поиска заголовков: $(SRCROOT)/Libraries/Release-iphoneos/include

    Аналогично, у вас могут быть разные пути для определенных пар Config/Target, хотя заголовки могут быть одинаковыми.

  • Свяжите приложение с стандартной библиотекой С++, добавив -lc++ в настройку сборки Другие компоновщики флагов.

  • Импортируйте заголовок в свои файлы следующим образом:

     #import <ThirdParty/third_party.hh>
    

Ответ 3

В XCode после установки "Пути поиска заголовка пользователя", чтобы указать на каталог вашей библиотеки, вы также должны убедиться, что для поля "Всегда искать пользовательские пути" установлено значение "Да"

Это решило проблему, с которой я столкнулся: с < boost/signals2.hpp > файл не найден с <angled> включите, вместо этого используйте "кавычки".

Ответ 4

В Xcode 9 мне нужно добавить путь к файлам заголовков в настройку Header Search Paths build, а не User Header Search Paths.

Xcode добавит User Header Search Paths для компиляции команды как -iquote, но добавит Header Search Paths как -I параметры. Это ключевое различие.