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 не найден во время сборки