Error Building static library on Windows

I'm trying to build a static library on Windows and am running into an error. In the Package.swift I've explicitly set the library type to .static, and calling swift build --verbose results in:

C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swiftc.exe -print-target-info
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swiftc.exe -print-target-info
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swiftc.exe -L C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\lib\swift\pm\ManifestAPI -lPackageDescription -sdk C:\Library\Developer\Platforms\Windows.platform\Developer\SDKs\Windows.sdk -libc MD -I C:\Library\Developer\Platforms\Windows.platform\Developer\Library\XCTest-development\usr\lib\swift\windows\x86_64 -L C:\Library\Developer\Platforms\Windows.platform\Developer\Library\XCTest-development\usr\lib\swift\windows -use-ld=lld -swift-version 5 -I C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\lib\swift\pm\ManifestAPI -package-description-version 5.6.0 C:\dev\swift-static-lib\Package.swift -o C:\Users\kevin\AppData\Local\Temp\TemporaryDirectory.lXBNxp\swift-static-lib-manifest.exe
C:\Users\kevin\AppData\Local\Temp\TemporaryDirectory.lXBNxp\swift-static-lib-manifest.exe -handle 37c -context "{""packageDirectory"":""C:\\dev\\swift-static-lib""}"
Building for debugging...
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swiftc.exe -module-name swift_static_lib -incremental -emit-dependencies -emit-module -emit-module-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.swiftmodule -output-file-map C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\output-file-map.json -parse-as-library -c C:\dev\swift-static-lib\Sources\swift-static-lib\swift_static_lib.swift -I C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug -target x86_64-unknown-windows-msvc -swift-version 5 -enable-batch-mode -index-store-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\index\store -Onone -enable-testing -g -j16 -DSWIFT_PACKAGE -DDEBUG -module-cache-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\ModuleCache -parseable-output -parse-as-library -sdk C:\Library\Developer\Platforms\Windows.platform\Developer\SDKs\Windows.sdk -libc MD -I C:\Library\Developer\Platforms\Windows.platform\Developer\Library\XCTest-development\usr\lib\swift\windows\x86_64 -L C:\Library\Developer\Platforms\Windows.platform\Developer\Library\XCTest-development\usr\lib\swift\windows -use-ld=lld
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swiftc.exe -frontend -c -primary-file C:\dev\swift-static-lib\Sources\swift-static-lib\swift_static_lib.swift -emit-module-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib~partial.swiftmodule -emit-module-doc-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib~partial.swiftdoc -emit-module-source-info-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib~partial.swiftsourceinfo -emit-dependencies-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib.d -emit-reference-dependencies-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib.swiftdeps -target x86_64-unknown-windows-msvc -disable-objc-interop -sdk C:\Library\Developer\Platforms\Windows.platform\Developer\SDKs\Windows.sdk -I C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug -I C:\Library\Developer\Platforms\Windows.platform\Developer\Library\XCTest-development\usr\lib\swift\windows\x86_64 -enable-testing -g -module-cache-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\ModuleCache -swift-version 5 -Onone -D SWIFT_PACKAGE -D DEBUG -enable-anonymous-context-mangled-names -autolink-library oldnames -autolink-library msvcrt -Xcc -D_MT -Xcc -D_DLL -parse-as-library -module-name swift_static_lib -o C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib.swift.o -index-store-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\index\store -index-system-modules
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swiftc.exe -frontend -merge-modules -emit-module C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib~partial.swiftmodule -parse-as-library -disable-diagnostic-passes -disable-sil-perf-optzns -target x86_64-unknown-windows-msvc -warn-on-potentially-unavailable-enum-case -disable-objc-interop -sdk C:\Library\Developer\Platforms\Windows.platform\Developer\SDKs\Windows.sdk -I C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug -I C:\Library\Developer\Platforms\Windows.platform\Developer\Library\XCTest-development\usr\lib\swift\windows\x86_64 -enable-testing -g -module-cache-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\ModuleCache -swift-version 5 -Onone -D SWIFT_PACKAGE -D DEBUG -enable-anonymous-context-mangled-names -autolink-library oldnames -autolink-library msvcrt -Xcc -D_MT -Xcc -D_DLL -emit-module-doc-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.swiftdoc -emit-module-source-info-path C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.swiftsourceinfo -module-name swift_static_lib -o C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.swiftmodule
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin\swiftc.exe -modulewrap C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.swiftmodule -o C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib.swiftmodule.o -target x86_64-unknown-windows-msvc
ar cr C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\libswift-static-lib.a C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib.swift.o C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\swift_static_lib.build\swift_static_lib.swiftmodule.o

Which ultimately produces this error:

error: command Archiving C:\dev\swift-static-lib\.build\x86_64-unknown-windows-msvc\debug\libswift-static-lib.a failed: unable to spawn process 'ar' (The system cannot find the file specified.)

Which makes sense, because this is on Windows and I don't have ar available.

I can manually assemble the output by just by using llvm-ar instead of ar, (I haven't tried with LIB.exe). Is there some option or config I missed that would make this work when just calling swift build?

Static linking on Windows is unsupported on SPM. This is something that I would like to see change, but there are issues within SPM that need to be worked through before we can make that possible. I would recommend that you consider using CMake if you intend to use static linking (also note that this will require the latest Swift snapshots).

CC: @tomerd @abertelrud

1 Like

Okay, good to know. I ended up creating an ar.bat file in the project directory that would just call llvm-ar. This seemed to work for the simple toy project, but I'll assume that was just luck.