4

Mac OS X 用の Swift アプリケーションで外部フレームワークを使用しようとしています。外部フレームワークも Swift を使用するため、Swift 共有ライブラリ (たとえば、libswiftCore.dylib) に依存します。これは、コマンドによって確認されます

$ otool -L PromiseKit.framework/PromiseKit
PromiseKit.framework/PromiseKit:
    ...
    @rpath/libswiftCore.dylib (compatibility version 0.0.0, current version 0.0.0)

見上げれ@rpathば分かる

$ otool -l PromiseKit.framework/PromiseKit
      ...
      cmd LC_RPATH
  cmdsize 40
     path @executable_path/Frameworks (offset 12)

したがって、実行時に@rpath解決することを期待しています@executable_path/Frameworks

問題

実行時エラーが発生する

dyld: Library not loaded: @rpath/libswiftCore.dylib
  Referenced from: .../PromiseKit.framework/Versions/A/PromiseKit
  Reason: image not found

ビルドした実行可能ファイルを含むフォルダーを調べても、Frameworksフォルダーが表示されません。

修正に失敗しました

アプリに設定しようとEMBEDDED_CONTENT_CONTAINS_SWIFTYESましたが、それでもフォルダーが作成されません。Frameworks

フォルダーを手動で作成Frameworksし、Swift 共有ライブラリにコピーしようとました ( /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx.

objc[64445]: Class _TtC10Foundation15NSSimpleCString is implemented in both
   .../Frameworks/libswiftFoundation.dylib and
   .../myApp.
   One of the two will be used. Which one is undefined.

質問

Swift ライブラリがアプリケーションに静的にリンクされている可能性はありますか? その場合、それをオフにして、Frameworks代わりに XCode にフォルダー バージョンを作成させるにはどうすればよいですか?

コマンドラインアプリであることは重要なポイントだと思います。通常のアプリを作成してフレームワークを追加しようとしましたがFrameworks、パッケージ内に予想されるフォルダーを取得し.app、Swift 共有ライブラリが含まれています

4

1 に答える 1

5

外部フレームワークの有無にかかわらず、迅速なコマンドライン ツールを入手できます。

  1. フレームワークは、Swift ライブラリをその Frameworks ディレクトリにコピーします (オプション)。
  2. コマンドライン ツールは、swift ライブラリをコピーしようとしてビルド エラーを生成しません。
  3. ツールの実行パスは、swift ライブラリを含むパスで構成されます

迅速なライブラリをコピーするためのフレームワークを取得するには、次のように設定します。

"Embedded Content Contains Swift Code" = Yes

ツールが Swift ライブラリを存在しない Bundle Frameworks ディレクトリにコピーしようとしたときにビルドが失敗しないようにするには、次のように設定します。

"Embedded Content Contains Swift Code" = Yes

ツールの実行パスを構成するには、次のいずれかを LD_RUNPATH_SEARCH_PATHS に追加します。

A. 外部フレームワークの迅速なライブラリ:

@executable_path/PromiseKit.framework/Versions/A/Frameworks

リソース、ヘッダー、およびモジュールのように、Xcode はデフォルトでバージョン/A/フレームワークをフレームワークにシンボリック リンクしないことに注意してください。

B. Xcode アプリの迅速なライブラリ:

$(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx

これは、実行可能ファイルを実行する必要がある各マシンに十分に類似した Xcode がインストールされている場合にのみ機能します。ただし、ツールを機能させるために外部フレームワークは必要ありません。

C. 実行可能ファイルと同じディレクトリに再配布された迅速なライブラリ:

@executable_path

または、実行可能ファイルが bin/ ディレクトリにあり、ライブラリが lib/ ディレクトリにある場合:

@executable_path/../lib

これは再配布することができ、ツールを機能させるために外部フレームワークを必要としません。ただし、この方法でディレクトリ構造を設定するには、Xcode でファイルを手動でコピーする必要があります。


ツールが次のように構成されている場合は、次の点に注意してください。

"Embedded Content Contains Swift Code" = Yes

Xcode は次のビルド エラーをスローします。

2015-06-04 00:56:28.816 swift-stdlib-tool[5208:2453424] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSFileManager copyItemAtPath:toPath:error:]: destination path is nil'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff8ee4503c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff89f1c76e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8ee44eed +[NSException raise:format:] + 205
    3   Foundation                          0x00007fff926569b7 -[NSFileManager copyItemAtPath:toPath:error:] + 185
    4   swift-stdlib-tool                   0x000000010526b485 _Z13copyLibrariesP8NSStringS0_P19NSMutableDictionary + 853
    5   swift-stdlib-tool                   0x000000010526c60b main + 3915
    6   libdyld.dylib                       0x00007fff97d785c9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Copying libswiftCore.dylib from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx to (null)
于 2015-06-03T15:25:20.870 に答える