web-dev-qa-db-ja.com

Swift、XCode6-Betaを使用した静的リンク

私はObj-CライブラリをSwiftに移植することを試みてきましたが、Swiftコードがプロジェクトにある場合、リンカーが静的ライブラリを構築できないという問題に遭遇しました。

最小限の再現者として、XCode6に移動し、新しいiOS静的ライブラリを作成します。空白の.hファイルと.mファイルを含むプロジェクトが表示されます。これは正常にコンパイルされます。次に、新しい.Swiftファイルをプロジェクトに追加します(ヘッダーブリッジの作成の有無にかかわらず)。これもshould正常にコンパイルされますが、代わりにリンク中に失敗します:

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ファイルがあると、ターゲットが静的ライブラリであるにもかかわらず、通常は実行可能ファイル用に予約されているリンカーオプションが使用されているようです。ビルドについて十分に理解していません。これがベータ版のバグであるかどうかを知るためのオプション、または構成する必要のあるオプション。このような些細な例でビルドが合法的に失敗するかどうかは疑わしいようです。何か考えはありますか?

18
karantza

コメントでの議論の後で私自身の質問に答えるために、Swiftコードを含む静的ライブラリを構築することはまだ不可能です。私はベータ4の時点でこれを書いています、そしてリリースノート「Xcode6ベータ4の既知の問題」の下でまだ言います:

Xcodeは、Swift code。(17181019)を含む静的ライブラリの構築をサポートしていません。

16
karantza

私もしばらくの間この問題を見てきました、これが私が見つけたものです:

まず、Xcode 6 Betaでは、Cocoa Touch静的ライブラリを作成するときに言語を選択できません。言語はデフォルトでObjective-Cに設定されていますが、Swiftファイルをプロジェクトに追加できます。結果としてあなたの質問のようにエラーが発生します。私の解釈では、Swift静的ライブラリの作成を回避するのはAppleの意図です。

したがって、Swiftの機能を活用するライブラリを構築する場合は、静的ライブラリの代わりにCocoa Touch Frameworkを使用してください。フレームワークプロジェクトとアプリプロジェクトを作成する手順を書きました。それを見つけることができますこここの例では、Objective-Cフレームワークプロジェクトを作成しました。純粋なSwiftフレームワークプロジェクトが必要な場合は、Language Swiftを選択します。

enter image description here

また、SwiftフレームワークをObjective-Cプロジェクトにインポートする場合、または言語を混在させる場合は、ここSwift and同じプロジェクトのObjective-C

これがあなたに良い方向性を与えることを願っています。

3
vladof81

この脅威を見てください XCode5シミュレーター:不明なオプション文字 `X'in:-Xlinker

エラーを理解するには、コマンドが何をしようとしているのかを理解する必要があります。

この場合、libtoolのわずかに変更されたバージョンであるLibtoolを使用しています。コマンドラインで指定されるオプションがいくつかありますが、探しているのは宛先ファイルであり、これは-oオプションとして渡されます。引数は/ Users/jr/ios/app/iCozi/buildです。/DevOnly-iphonesimulator/libCozi\Common\Code.a、および生成しているライブラリのタイプ。この場合は-staticです。両方のオプションを一緒にすると、静的ライブラリアーカイブを作成していることが明示的に示されます。

静的ライブラリアーカイブを作成しているため、実際に実行しているのは、.oファイルと場合によっては.aファイルを取得し、それらを別の.aファイルに変換することだけです。これは、ファイルのセット(.o)および他の.Zipファイルの内容(.a)から.Zipファイルを作成することとほぼ同じです。このアーカイブの作成中にできることはほとんどありません。たとえば、静的アーカイブの作成中に暗黙的にリンクする必要のあるライブラリを指定したり、資格が必要になることを指定したりすることはできません。

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で指定された資格ファイルを削除することでした。

2
Alberto Barrera

このブログをチェックしてください(翻訳が必要です)

http://andelf.github.io/blog/2014/06/25/write-Swift-module-with-Swift-cont/

1
Aggressor

私は同じ問題に遭遇し、それに対する解決策を見つけました。 'libtool'は、静的ライブラリではサポートされていないように見えるSwiftモジュール-を指定しようとする-Xlinker属性が原因で失敗しています(これもAppleの間違い/欠陥だと思いますが、多分それは別のスレッドのための議論です)

私がしたことは、libtoolコマンド全体をターミナルにコピーして貼り付け、すべての「-XLinker ...」パラメーターを削除し、驚くべきことにコマンドラインからビルドに成功したことです。

私の静的ライブラリプロジェクトには、Objective-CとSwiftソースの両方が含まれており、両方とも生成された静的ライブラリに「パック」されていました。

唯一の欠点は、Swiftモジュールが作成されなかったことですが、私の場合、Swiftは内部でのみ使用されていたため、問題ではありませんでした。外部にはObjectiveCしかありませんでした。インターフェイス。

生成された静的ライブラリに沿って生成された静的ライブラリブリッジヘッダーをコピーすることで、Swift 'インターフェイス'を公開することも可能だと思います。

0
Matej Ukmar