23
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Xcode,Swiftのバイナリ互換性

Last updated at Posted at 2018-09-19

2019/03/26

Xcode10.2とSwift5がリリースされ、以降はバイナリ互換性がとられるはずなので、以下の内容は古い内容となっています。関係者の方々、ありがとうございます。


以下古い内容

2018/10現在、Swiftのライブラリ、実行ファイルのバイナリはバージョン間の互換性が保証されておりません。ABI安定化がSwift5でということなので、もう少しの辛抱です。

参考: https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md
参考: https://swift.org/abi-stability/

とはいえ、現状どのXcodeバージョン間で互換性があるのかはっきりした情報が見つからず、ライブラリなんかを提供しているとあいまいで困るので調べてまとめました。

次の表の行と列は

  • ビルドする側のswiftバージョン
  • リンクしようとしたライブラリをビルドした側のswiftのバージョン

の組み合わせで、ビルドできる(OK)、ビルドエラー(NG)を書き出したものです。

Xcode swift 3.1 4.0 4.0.2 4.0.3 4.1 4.1.2 4.2 4.2.1 5.0
8.3.3 3.1 OK NG NG NG NG NG NG NG NG
9.0, 9.0.1 4.0 NG OK NG NG NG NG NG NG NG
9.1 4.0.2 NG NG OK OK NG NG NG NG NG
9.2 4.0.3 NG NG OK OK NG NG NG NG NG
9.3, 9.3.1 4.1 NG NG NG NG OK OK NG NG NG
9.4, 9.4.1 4.1.2 NG NG NG NG OK OK NG NG NG
10.0 4.2 NG NG NG NG NG NG OK OK NG
10.1 4.2.1 NG NG NG NG NG NG OK OK NG
10.2 5.0 NG NG NG NG NG NG NG NG OK

まとめ

つまり、3.1から4.2.1の間では、以下のことが言えます。

  • swift4.0とswift4.0.1, swift4.0.2の間は互換性がない
  • それ以外は、swiftのメジャー、マイナーバージョンが同じであれば互換性がある。
  • 上位互換のような、片方向の互換性がある組み合わせはない。
    • 例えば「x.0のバイナリはx.1でリンクできるが、逆はできない」のようなことはない

補足

バイナリ互換性がないと何が起きるか

バイナリの互換性がないframeworkなどをリンクしようとすると、次のようなエラーが出ます。


$ swiftc ../main.swift -I . -L . -llucky
../main.swift:1:8: error: module compiled with Swift 4.0 cannot be imported in Swift 4.1.2: /Users/gamako/Documents/work/sst/project/sdk/swift-version-check/build.9.0/./lucky.swiftmodule
import lucky

ライブラリのswiftバージョンの確認方法

ライブラリフレームワークをビルドしたときのSwiftのバージョンは、xxx.swiftmoduleファイルには文字列として入っているようなので、次の方法で強引に取得することができるようです。

$ strings arm64.swiftmodule  | grep "Swift version"
4.1(4.1)/Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.37.1)

ソースコードの互換性

バイナリの互換性と、ソースコードの互換性は別の話題です。swift4.2のコンパイラは、swift3.1書式のソースコードをコンパイルすることができます。ただし、この場合swift4.2形式でバイナリを出力するため、swift3.1でリンクすることはできません。

link

調べるのに使ったソースコード
https://github.com/gamako/swift-binary-compatibility-matrix

23
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?