2017-02-22 1 views
2

У меня есть статическая библиотека от стороннего SDK - это FIT SDK, который кодирует и декодирует «Flexible Interoperable Data Transfer Protocol», используемый для различных видов спорта и фитнеса оборудование. Это двоичный формат, хорошо описанный в SDK, который также поставляется с кучей примеров CPP, C-Sharp и Objective-C - плюс статическая библиотека, построенная из источника CPP.Building Swift, Objective-C и статическая библиотека C++ вместе

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

Я сделал экран (https://vimeo.com/205082135), показывая, что происходит, и именно поэтому я здесь.

Я могу получить Xcode 8 (beta 3), чтобы создать новый, свежий проект, содержащий библиотеку и даже некоторый код Objective-C. Как только я добавляю заголовок моста, даже с рудиментарным включением, кратеры XCode с ошибкой Linker, жалуются, что не могут найти какой-либо класс из стандартной библиотеки C++, например или. Пахнет проблемой управления конфигурацией с помощью Xcode, который я просто не могу разобраться.

Мой пример проекта с библиотекой здесь: https://github.com/bleeckerj/Xcode-FIT-TEST

Кто-нибудь видел такую ​​вещь раньше?

+1

Я не уверен, что это полностью решит вашу проблему, но Swift не может взаимодействовать с C++ напрямую. Вам нужно будет обернуть C++ lib API Objective C и выставить только Objective C API для Swift. –

+0

Комментарий Дейва верен. Вы можете использовать API C (не C++) непосредственно из Swift или API Obj-C, если он есть (хотя, основываясь на том, что ваш проект имеет .mm-файлы, я предполагаю, что не существует ранее существовавшего обертка). В противном случае вам придется обернуть его самостоятельно. – jtbandes

+0

См. Также: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID17 – jtbandes

ответ

0

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

Фактически, требуется оболочка Objective-C вокруг класса C++ (или Objective-C++), содержащего код, который требуется выставить и вызвать из Swift. Затем есть заголовок Bridging Header, который предоставляет только этот класс Objective-C. Этот конкретный заголовок моста Это звучит просто, и теперь это действительно легко, но это было для меня загадкой. Это длинная история, поэтому я объясняю ее как часть образца репозитория https://github.com/bleeckerj/fit-sdk-with-swift, полученного из FIT SDK, который отвечает на вопрос с примера.

Надеюсь, что это поможет всем, кто сталкивается с этой проблемой.