↑公式サイトから Windows版 Swiftインストーラswift-5.10.1-RELEASE-windows10.exe
をダウンロードしてインストールしたが、コンパイルできなかった。
> swift .\hello.swift
<module-includes>:1:10: note: in file included from <module-includes>:1:
#include "AssertionReporting.h"
^
C:\Users\USERNAME\AppData\Local\Programs\Swift\Platforms\5.10.1\Windows.platform\Developer\SDKs\Windows.sdk\usr\lib\swift\shims/AssertionReporting.h:16:10: note: in file included from C:\Users\USERNAME\AppData\Local\Programs\Swift\Platforms\5.10.1\Windows.platform\Developer\SDKs\Windows.sdk\usr\lib\swift\shims/AssertionReporting.h:16:
#include "SwiftStdint.h"
^
C:\Users\USERNAME\AppData\Local\Programs\Swift\Platforms\5.10.1\Windows.platform\Developer\SDKs\Windows.sdk\usr\lib\swift\shims/SwiftStdint.h:28:10: error: 'stdint.h' file not found
#include <stdint.h>
^
<unknown>:0: error: could not build C module 'SwiftShims'
Swift 5.9.2、Swift 5.8.1 の旧バージョンをインストールしてみたが、同じ現象でした。
数年前に当時のSwiftをインストールしたときは、こんなことにはならず すんなりコンパイルできたのに。。。
どうやら、Visual Studio Communityをダウンロードして、MSVC等のデスクトップ開発環境のインストールが前提となったようだ。
公式のドキュメントに書いてありました。
You will need to install Visual Studio with the following components.
ですが、Windows11からWindows Package Manager
を使ったインストール方法があり、こちらの方がずっと簡単にインストールできたので、ここに手順のみまとめておきます。
Windows Package Manager を使ったインストール方法
手順は3つ。
手順 1
設定 → システム → 開発者向け → 開発者モード → 「オン」にする
手順 2
次のコマンドで Visual Studio の必要なコンポーネントをインストールする。
> winget install --id Microsoft.VisualStudio.2022.Community --exact --force --custom "--add Microsoft.VisualStudio.Component.Windows11SDK.22000 --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64"
Visual Studioのインストーラが起動し、必要なコンポーネントのダウンロードとインストールが自動的に走る。
自分のPCだと、30分ほどかかりました。
手順 3
次のコマンドで Swift(及びツールチェーン)をダウンロード&インストールする。
> winget install --id Swift.Toolchain -e
当然、最新バージョンがインストールされます。
Windows10 の場合のコマンド
Windows10 においても、winget
をインストールすれば、同様の手順で可能ですが、まったく同じコマンドではエラーとなったので、Windows10 の場合のコマンドを書いておきます。
> winget install --id Microsoft.VisualStudio.2022.Community --exact --force --custom "--add Microsoft.VisualStudio.Component.Windows10SDK.17763 --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64" --source winget
> winget install --id Swift.Toolchain -e --source winget
確認
以上で、インストールできたので、実際に確認します。
> swift --version
Swift version 5.10.1 (swift-5.10.1-RELEASE)
Target: x86_64-unknown-windows-msvc
> swift hello.swift
<unknown>:0: error: could not load the swift standard library
> swiftc hello.swift
ライブラリ hello.lib とオブジェクト hello.exp を作成中
> .\hello.exe
Hello! Swift!
> mkdir MyCLI
> cd MyCLI
> swift package init --type executable
Creating executable package: MyCLI
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources\main.swift
> swift run MyCLI
Building for debugging...
[8/8] Linking .\.build\x86_64-unknown-windows-msvc\debug\MyCLI.exe
Build complete! (5.35s)
Hello, world!
Replも確認しておきます。
> swift repl
Welcome to Swift version 5.10.1 (swift-5.10.1-RELEASE).
Type :help for assistance.
1> print("hello")
2> :quit
公式手順通りにインストールできたのですが、何かおかしいです。
今後、原因究明して記事をアップデートします。
原因究明履歴
2024.6.22追記
swift -print-target-info
で出てきた以下の内容。
> swift -print-target-info
Swift version 5.10.1 (swift-5.10.1-RELEASE)
Target: x86_64-unknown-windows-msvc
C:\Users\USERNAME\AppData\Local\Programs\Swift\Toolchains\5.10.1+Asserts\usr\bin\swift-frontend.exe -frontend -print-target-info -target x86_64-unknown-windows-msvc
{
"compilerVersion": "Swift version 5.10.1 (swift-5.10.1-RELEASE)",
"target": {
"triple": "x86_64-unknown-windows-msvc",
"unversionedTriple": "x86_64-unknown-windows-msvc",
"moduleTriple": "x86_64-unknown-windows-msvc",
"compatibilityLibraries": [ ],
"librariesRequireRPath": false
},
"paths": {
"runtimeLibraryPaths": [
"C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift\\windows"
],
"runtimeLibraryImportPaths": [
"C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift\\windows",
"C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift\\windows\\x86_64"
],
"runtimeResourcePath": "C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Swift\\Toolchains\\5.10.1+Asserts\\usr\\lib\\swift"
}
}
一つ上の階層のswift
までは存在するが、↓このフォルダが存在しない。
C:\Users\USERNAME\AppData\Local\Programs\Swift\Toolchains\5.10.1+Asserts\usr\lib\swift\windows
これが関係しているかも?と考え、空のwindows
フォルダを作ってみたが、結果は変わらない。
error: could not load the swift standard library
せめて、そのライブラリ名が判明すれば何とかなるようにも思うが、未だ原因不明だ。
ちなみに、Macで同じコマンドを実行した結果は、以下の内容。
$ swift -print-target-info
Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
Target: arm64-apple-macosx14.0
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -print-target-info -target arm64-apple-macosx14.0
{
"compilerVersion": "Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)",
"target": {
"triple": "arm64-apple-macosx14.0",
"unversionedTriple": "arm64-apple-macosx",
"moduleTriple": "arm64-apple-macos",
"compatibilityLibraries": [ ],
"librariesRequireRPath": false
},
"paths": {
"runtimeLibraryPaths": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx",
"/usr/lib/swift"
],
"runtimeLibraryImportPaths": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx"
],
"runtimeResourcePath": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift"
}
}
$ ls /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
Cxx.swiftmodule libswiftCompatibility51.a
CxxStdlib.swiftmodule libswiftCompatibility56.a
layouts-x86_64.yaml libswiftCompatibilityConcurrency.a
lib_InternalSwiftScan.dylib libswiftCompatibilityDynamicReplacements.a
libcxxshim.h libswiftCompatibilityPacks.a
libcxxshim.modulemap libswiftCxx.a
libcxxstdlibshim.h libswiftCxxStdlib.a
libswiftCompatibility50.a prebuilt-modules
Macがグローバルインストールに対し、Windows11ではユーザインストールになっている点が違う。インストール時にインストール先は聞かれなかった。影響は分からない。
2024.6.26追記
winget
でグローバルインストールを指定するオプションを見つけたので、そのオプションでインストールしてみた。
> winget install --scope machine --id Swift.Toolchain -e
その結果、swift -print-target-info
で出てくる内容も変化した。確かにパスがグローバルになった。
> swift -print-target-info
{
"compilerVersion": "Swift version 5.9.2 (swift-5.9.2-RELEASE)",
"target": {
"triple": "x86_64-unknown-windows-msvc",
"unversionedTriple": "x86_64-unknown-windows-msvc",
"moduleTriple": "x86_64-unknown-windows-msvc",
"compatibilityLibraries": [ ],
"librariesRequireRPath": false
},
"paths": {
"runtimeLibraryPaths": [
"C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows"
],
"runtimeLibraryImportPaths": [
"C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows",
"C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows\\x86_64"
],
"runtimeResourcePath": "C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift"
}
}
> ls "C:\\Library\\Developer\\Toolchains\\unknown-Asserts-development.xctoolchain\\usr\\lib\\swift\\windows"
Get-ChildItem: Cannot find path 'C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\lib\swift\windows' because it does not exist.
しかし、C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\lib\swift\windows
のパスが存在しないことは、変わらず同じ。
なぜか、バージョンがダウンした。
> swift --version
Swift version 5.9.2 (swift-5.9.2-RELEASE)
Target: x86_64-unknown-windows-msvc
しかし、swift hello.swift
の結果はエラーのまま。。。
> swift hello.swift
<unknown>:0: error: could not load the swift standard library