2015-04-07 4 views
1

Краткое резюме: как добавить добавленный путь к заголовкам, распространяемым с Xcode, в файл .podspec.json?Спецификация Cocoapods, которая использует C++ и компилирует в качестве рамки

Я работаю над проектом Swift, в котором хочу включить AudioKit в качестве зависимости. Для этого проекта я должен добавить 'use_frameworks!' в моем Podfile

Так что я добавить свой стручок в Podfile (основной репо еще не обновлен, поэтому я указываю на GitHub репо напрямую)

pod 'AudioKit', :git => 'https://github.com/niklassaers/AudioKit.git' 

и добавить в одну из моих Swift файлы

import AudioKit 

тогда мой компилятор предупредит меня, что CsoundFile.hpp ссылается iostream, которые не могут быть найдены. iostream.h в:

/Applications/Xcode62.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/c++/4.2.1/backward/iostream.h

по сравнению с stdlib.h, которая находится в:

/Applications/Xcode62.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/ stdlib.h

Как добавить этот каталог заголовков в путь поиска в AudioKit.podspec.json (который я разветвил).

Я сделал пример проекта, который показывает то, что я написал здесь: https://github.com/niklassaers/AudioKitSwiftFrameworkError - вы можете скачать его и скомпилировать, и вы увидите сообщение об ошибке.

+1

Я не смотрел в эту библиотеку, но вы не можете получить доступ к C++ непосредственно из Swift. Как отмечено [здесь] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html) –

+0

Я не получаю доступ непосредственно к C++, я включаю зависимость Cococapods который написан в Objective-C и содержит компонент C++ в моем проекте Swift. И поскольку я хочу использовать другую зависимость, написанную в Swift, я должен использовать «use_frameworks!». директива – niklassaers

+1

Импортируя фреймворк, который использует C++ в своих заголовках, вы используете C++ непосредственно в Swift. Вы также можете увидеть этот факт, внимательно посмотрев на ошибку компилятора, которую генерирует ваш пример, и говорит «Swift Compiler Error» прямо в навигаторе проблем. – NeoNacho

ответ

5

Основная проблема здесь в том, что в AudioKit.podspec.json отсутствует определение общего заголовка. Таким образом, все заголовки считаются общедоступными, включая заголовки C++.

Как нет транзитивного импорта из заголовков класса Objective-C, это должно работать, если только те, которые объявлены общественности:

"public_header_files": [ 
    "AudioKit/Core Classes/**/*.h", 
    "AudioKit/Instruments/**/*.h", 
    "AudioKit/Notes/**/*.h", 
    "AudioKit/Operations/**/*.h", 
    "AudioKit/Parameters/**/*.h", 
    "AudioKit/Sequencing/**/*.h", 
    "AudioKit/Tables/**/*.h", 
    "AudioKit/Utilities/**/*.h" 
], 
… 
"osx": { 
    … 
    "public_header_files": ["AudioKit/Platforms/OSX/classes/*.h"] 
} 
"ios": { 
    … 
    "public_header_files": ["AudioKit/Platforms/iOS/classes/*.h"] 
} 
+0

Большое спасибо, Мариус, это решило проблему полностью! :-) – niklassaers

+0

Это хорошо работает при компиляции с симулятором, но компиляция на устройстве все еще не работает на csound.h. Это не входит в публичные заголовки, но в AudioKit/Platforms/iOS/headers/csound.h и AudioKit/Платформы/OSX/CsoundLib64.framework/Версии/6.0/Заголовки/csound.h Любое предложение о том, почему оно может действовать вверх?(ref https://github.com/audiokit/AudioKit/pull/111 и https://github.com/niklassaers/AudioKit/blob/develop/AudioKit.podspec.json) – niklassaers