Подтвердить что ты не робот

Статическая связь с Swift, XCode6-Beta

Я экспериментировал с переносом библиотеки Obj-C в Swift, и у меня возникла проблема, когда компоновщик не смог создать статическую библиотеку, когда код Swift находится в проекте.

Как минимальный проигрыватель, перейдите в XCode6 и создайте новую статическую библиотеку iOS. Это даст вам проект с пустым .h и .m файлом. Это будет скомпилировано. Затем добавьте в проект новый .swift файл (с созданием моста заголовка или без него). Это тоже должно компилироваться отлично, но вместо этого он не работает при связывании:

Libtool /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Products/Debug-iphonesimulator/libTest.a normal i386
    cd /Users/alexkarantza/Workspace/Test
    export IPHONEOS_DEPLOYMENT_TARGET=8.0
    export PATH="/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode6-Beta.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -static -arch_only i386 -syslibroot /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk -L/Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Products/Debug-iphonesimulator -filelist /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Intermediates/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/i386/Test.LinkFileList -ObjC -L/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator -Xlinker -rpath -Xlinker /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator -Xlinker -force_load -Xlinker /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a -Xlinker -sectalign -Xlinker __SWIFT -Xlinker __ast -Xlinker 4 -Xlinker -sectcreate -Xlinker __SWIFT -Xlinker __ast -Xlinker /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Intermediates/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/i386/Test.swiftmodule -o /Users/alexkarantza/Library/Developer/Xcode/DerivedData/Test-alenfoymgkewlghfjjvizjjuvign/Build/Products/Debug-iphonesimulator/libTest.a

error: /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: unknown option character `X' in: -Xlinker
Usage: /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -static [-] file [...] [-filelist listfile[,dirname]] [-arch_only arch] [-sacLT] [-no_warning_for_no_symbols]
Usage: /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool -dynamic [-] file [...] [-filelist listfile[,dirname]] [-arch_only arch] [-o output] [-install_name name] [-compatibility_version #] [-current_version #] [-seg1addr 0x#] [-segs_read_only_addr 0x#] [-segs_read_write_addr 0x#] [-seg_addr_table <filename>] [-seg_addr_table_filename <file_system_path>] [-all_load] [-noall_load]

Это происходит, если я нацелен на симулятор или устройство. Похоже, возможно, наличие файла Swift в проекте заставляет его использовать параметры компоновщика, обычно зарезервированные для исполняемых файлов, даже если целью является статическая библиотека? Я не знаю достаточно о вариантах сборки, чтобы узнать, является ли это ошибкой в ​​бета-версии, или какой-то вариант, который мне нужно настроить. Кажется сомнительным, что сборка законно потерпит неудачу на таком тривиальном примере. Любые мысли?

4b9b3361

Ответ 1

Чтобы ответить на мой собственный вопрос после некоторого обсуждения в комментариях, просто невозможно создать статические библиотеки, которые еще содержат код Swift. Я пишу это с Beta 4, и в примечаниях к выпуску все еще говорят, что в разделе "Известные проблемы в Xcode 6 beta 4":

Xcode не поддерживает создание статических библиотек, содержащих Swift-код. (17181019)

Ответ 2

Я рассматривал эту проблему слишком долго, вот что я нашел:

Во-первых, в Xcode 6 Beta нет выбора языка при создании Cocoa Touch Static Library, язык по умолчанию равен Objective-C, хотя вы можете добавить файл Swift в проект, он дает ошибку, как в вашем вопросе. Моя интерпретация заключается в том, что Apple намерена избегать создания статической библиотеки Swift.

Итак, если вы намерены создать библиотеку, которая использует силу Swift, используйте Cocoa Touch Framework вместо статической библиотеки. Я написал инструкции по созданию проекта рамочного проекта и приложения, вы можете найти его здесь. Примечание в этом примере я создал проект рамки Objective-C. Выберите Язык Swift, если вы хотите создать чистый проект рамок Swift.

enter image description here

Также обратите внимание. Если вы хотите импортировать структуру Swift в проект Objective-C или смешать языки, здесь есть хорошее чтение Swift and Objective-C в том же проекте.

Надеюсь, это даст вам хорошее направление.

Ответ 3

Посмотрите на эту угрозу Симулятор XCode5: неизвестный символ опции` X 'в: -Xlinker

Чтобы понять ошибку, вы должны понять, что команда пытается сделать.

В этом случае он использует Libtool, который является слегка измененной версией из libtool. Существуют некоторые параметры, указанные в команде line, но то, что мы ищем, является файлом назначения, и это передается как опция -o, аргументом которого является /Пользователи/jr/ios/app/iCozi/build/DevOnly-iphonesimulator/libCozi\Common \ Code.a и тип библиотеки, которую мы создаем, и в этом случае он -статический. Оба варианта вместе указывают, что вы создание статического библиотечного архива.

Потому что вы создаете архив статической библиотеки, единственное, что вы на самом деле это делать файлы .o и, возможно, файлы .a и их в другой файл .a. Это можно приблизительно приравнять к созданию .zip файла из набора файлов (.o) и содержимого других .zip файлы (.a). Есть очень мало вещей, которые вы можете сделать, когда делаете этот архив, например, вы не можете указать библиотеки, которые должны быть неявно связанные при построении статического архива, вы не можете указать что вам потребуются права.

libtool жалуется, потому что не понимает опций, которые используются для передачи статической библиотеки. В этом Варианты:

-Xlinker -sectcreate -Xlinker __TEXT -Xlinker __entitlements -Xlinker/Users/jr/ios/app/iCozi/build/iCozi.build/DevOnly-iphonesimulator/Cozi \ Common\Code.build/Cozi\Common\Code.xcent

Это параметры, которые присутствуют, когда вы пытаетесь связать файл прав, что означает, что некоторые параметры указывают на использование файла прав. В этом случае вы нашли правильное решение самостоятельно, который должен был удалить файл прав, указанный в настройки проекта → Подписание кода → Права на подпись кода → DevOnly.

Ответ 5

Я столкнулся с той же проблемой, и я нашел решение для нее. "libtool" терпит неудачу из-за атрибута -Xlinker, который пытается указать модуль Swift, который, похоже, не поддерживается для статических библиотек. (Я также считаю, что это ошибка/недостаток Apple, но, возможно, это обсуждение для другого потока)

Что я сделал, так это скопировать/вставить всю команду libtool на терминал, удалить все параметры "-XLinker..." и на удивление построить из командной строки.

Мой проект статической библиотеки включал в себя как Objective-C, так и источники Swift, и они оба были "упакованы" в созданную статическую библиотеку!

Единственным недостатком было то, что модуль Swift не был создан, но в моем случае это не имело значения, потому что Swift использовался только внутри - у меня были только внешние интерфейсы Objective C.

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