【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
にも同様の問題が報告されていたので、それを今回は参考にさせていただきました。
恐らく解決策は状況により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 Library
と Dynamic Library
の振る舞いの違いについては以前にも記事で書いています。ちなみに、SwiftPM
で導入されたライブラリの Build
には、オブジェクトファイル(.o
) がありました👀
2つ目のパターンは、メインターゲット以外の1つのターゲットにライブラリを追加する場合です。この場合は、重複するメインターゲットの Frameworkds, Libraries, and Embedded Content
から該当するライブラリを削除すれば、うまく動作するかと思われます。
まだ若干痒いところもある SwiftPM
ですがこれからも進化していくことに期待しましょう🚀
てな感じで本日は以上になります🍺