it-swarm.com.ru

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

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

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

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

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

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

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

Спасибо!

18
meaning-matters
#include <bla.h>

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

#include "bla.h"

Смотри например 

В качестве обходного пути вы можете установить для параметра сборки Xcode «Всегда искать пути пользователя» значение YES.

32
Martin R

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

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

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

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

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

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

    В приведенном примере добавьте следующие пути поиска библиотеки для настройки отладки и выпуска:

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

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

    У вас могут быть разные пути поиска в библиотеке для конкретных пар Конфигурация и Целевая платформа. Установите различные пути в настройке сборки соответственно.

  4. Настройка сборки «Пути поиска по заголовку»:

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

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

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

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

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

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

     #import <ThirdParty/third_party.hh>
    
13
CouchDeveloper

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

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

3
Piasy

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

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

0
Donovanr