iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【SwifPM】Swift package product '' is linked as a static library by '' and ''. This will result in duplication of library code. をどう対処する?

先日に引き続き、Carthage を剥がして Swift Package Manager への移行作業をしている際に下記のようなエラーに遭遇しました。

具体的には、マルチモジュール化しているプロジェクトのメインターゲット以外にも、SwiftPM で導入したライブラリを Frameworks and Libraries セクションに追加してビルドした際にエラーが発生しました。ちなみに、ライブラリを追加しない場合は、シンボルエラーによりビルドが失敗します。

Swift package product '' is linked as a static library by '' and ''. This will result in duplication of library code.

解決策

Swift Forums にも同様の問題が報告されていたので、それを今回は参考にさせていただきました。

forums.swift.org

恐らく解決策は状況により2パターン存在するかと思います。

1つ目のパターンは、メインターゲットとそれ以外の1つ以上のターゲットにライブラリを追加する場合です。SwiftPM はライブラリが静的にリンクされるため、それぞれのターゲットにライブラリをリンクするとコードが重複し、今回のタイトルのようなエラーが発生します。現状だとdynamic link として動作させることができないそうなので、仲介となるターゲットを追加し、そのターゲットにライブラリをリンクさせることで dynamic link のように振舞わせることが可能です。

Swift package product '' is linked as a static library by '' and ''. This will result in duplication of library code.

Static LibraryDynamic Library の振る舞いの違いについては以前にも記事で書いています。ちなみに、SwiftPM で導入されたライブラリの Build には、オブジェクトファイル(.o) がありました👀

yamato8010.hatenablog.com

2つ目のパターンは、メインターゲット以外の1つのターゲットにライブラリを追加する場合です。この場合は、重複するメインターゲットの Frameworkds, Libraries, and Embedded Content から該当するライブラリを削除すれば、うまく動作するかと思われます。

まだ若干痒いところもある SwiftPM ですがこれからも進化していくことに期待しましょう🚀

てな感じで本日は以上になります🍺

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com