Swift Framework с libxml

У меня есть проект Swift Framework, который использует библиотеку KissXML Objective-C. KissXML внутренне использует libxml.

Когда я строю проект xcode (Xcode 6 - бета 5), я получаю эту ошибку:

error: <unknown>:0: error: '/SwiftFramework/SwiftFramework/KissXML/DDXMLNode.h:2: include of non-modular header inside framework module SwiftFramework.DDXMLNode

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

#import <libxml/tree.h>

Любые предложения о том, как справиться с этим?

Примечание: я использовал KissXML в проекте только Objective-C, и он работал нормально (Xcode 5).

2 ответа

Решение

Хитрость заключается в том, чтобы создать модуль и включить его в свой проект.

Чтобы создать модуль, вы создаете файл с именем, скажем, module.modulemap, который экспортирует API в интересующие заголовочные файлы, например:

module libxmlModuleDevice {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/tree.h"
    export *
}

module libxmlModuleSimulator {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/libxml2/libxml/tree.h"
    export *
}

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

Этот файл module.modulemap можно разместить где угодно. Я создал каталог с именем modules на том же уровне, что и файл проекта Xcode (.xcodeproj), и разместил там файл module.modulemap.

Затем добавьте каталог, содержащий этот файл, в путь поиска заголовка в разделе " Настройки сборки" вашего проекта XCode.

В этом примере все, что вам нужно сделать, это добавить слова модули в Путь поиска заголовка, потому что каталог модулей находится на том же уровне, что и файл проекта XCode. Это обновит внутреннюю переменную проекта Xcode HEADER_SEARCH_PATHS. Вот и все.

В xcode6, iphone8.3 путь будет

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.3.sdk/usr/include/libxml2

* обновление: более простой способ: $(SDKROOT)/usr/include/libxml2
спасибо: iPhone libxml2 не найден во время сборки

Другие вопросы по тегам