Использование внешних заголовков С++ в Objective-C
В моем проекте iOS мне нужно использовать внешнюю библиотеку, написанную на С++. Файлы заголовков С++ находятся в одном каталоге.
Я добавил эти заголовки С++ к моему проекту Xcode, а также указал путь поиска заголовка (в настройках сборки).
Проблема заключается в том, что эти заголовки С++ включают друг друга, используя < > угловые скобки. Это приводит к:
'filename.h' file not found with <angled> include, use "quotes" instead.
Странно, что Xcode не жалуется на все заголовки. Также тот же заголовок # include'd в одном файле прекрасен, а проблема, когда # include'd в другом. Я думаю, это связано с тем, что эти заголовки # включают друг друга.
- Почему путь поиска не работает?
- Есть ли способ разрешить это без изменения этих файлов заголовков?
Спасибо!
Ответы
Ответ 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
параметры. Это ключевое различие.