Error: toolchain is invalid: could not find CLI tool `link` at any of these directories

I installed Swift on windows using WinGet as described in Swift.org - Installation via Windows Package Manager . Then I tried swift test with my CLI tool project, which compiles successfully on macOS and Linux, and got the error error: toolchain is invalid: could not find CLI tool link at any of these directories. How can I solve this?

[Environment info]

  • Windows 11 24H2
  • CPU: Intel Core i7-8700
  • Executing link on the command prompt resulted in the not found error.
  • The command lldb on the command prompt successfully launched with the output lldb version 19.1.4 Swift version 6.1 (swift-6.1-RELEASE).
  • Python version: Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
  • Since my user name contains a space, I used the technique described in Swift Windows "unable to load standard library for target 'x86_64-unknown-windows-msvc'" . I created the symbolic link on the D drive and modified SDKROOT to D:\swiftsdk.

Did you install Visual Studio as well? Which version and which components?

I installed Visual studio community 2022 with the command winget install --id Microsoft.VisualStudio.2022.Community --exact --force --custom "--add Microsoft.VisualStudio.Component.Windows11SDK.22000 --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.VC.Tools.ARM64".
The version 17.13.6 is installed, with the components

  • MSVC v143 - VS 2022 C++ x64/x86 build tool
  • MSVC v143 - VS 2022 C++ ARM64/ARM64EC build tool
  • Windows 11 SDK (10.0.22000.0)

Okay, that is odd. By default SPM should use lld, but, link should be available. With 6.1, I don’t expect this to occur. I would say, ensure that C:\Users\…\Programs\Swift\Platforms\Windows.platform\Info.plist exists, and if not, perhaps run the repair or re-install the toolchain.

Do you mean C:\Users\(User name)\AppData\Local\Programs\Swift\Platforms\6.1.0\Windows.platform\Info.plist?
It exists and its content is as follows.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>DefaultProperties</key>
	<dict>
		<key>SWIFTC_FLAGS</key>
		<array>
			<string>-use-ld=lld</string>
		</array>
		<key>SWIFT_TESTING_VERSION</key>
		<string>development</string>
		<key>XCTEST_VERSION</key>
		<string>development</string>
	</dict>
</dict>
</plist>

Yes, that is the right file and that clearly has the right content. The DefaultProperties.SWIFTC_FLAGS is meant to wire up the -Xswiftc -use-ld=lld so that ld.lld is used. Can you run swift package clean & swift test -v so that we could see what is going on with the invocation? SPM should be defaulting to lld (simply to avoid the need to run in the VS Developer Command Prompt).

I tried swift package clean & swift test -v but it resulted in the same error, toolchain is invalid: could not find CLI tool link at any of these directories. Even swift package clean seems to require link.exe...
I understood that it seems to be a Visual studio problem rather than Swift toolchain. I googled it, and some search results say that I need to install "Desktop development with C++" workload, so I installed it but the situation did not change. link.exe on the command prompt returned the unknown program error.

That is trivial to work around: use the correct command prompt. You should have a Developer Command Prompt that is in the start menu after installing Visual Studio.

The idea is that SPM should be trying to use lld. You should be able to workaround it as: swift package clean -Xswiftc -use-ld=lld -Xbuild-swiftc -use-ld=lld but that shouldn't be required, the Info.plist is meant to default those flags on your behalf (as this predates the swift build build).

Could you share the output of swift test -v please?

Using the developer command prompt solved the issue of toolchain is invalid. Thank you.

But it emitted another error. The output for swift test -v is as follows, although it is quite long and in Japanese.
The compiiler seems to still use link.exe instead of lld, and there is an architecture mismatch of x86 and x64.

error: 'simutransworldmonitorserver': Invalid manifest (compiled with: ["C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\bin\\swiftc.exe", "-vfsoverlay", "C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.Y7nJjr\\vfs.yaml", "-L", "C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\pm\\ManifestAPI", "-lPackageDescription", "-sdk", "D:\\Documents\\swiftsdk", "-libc", "MD", "-swift-version", "6", "-I", "C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\pm\\ManifestAPI", "-package-description-version", "6.0.0", "D:\\Documents\\simutrans_world_monitor_2\\SimutransWorldMonitorServer\\Package.swift", "-v", "-o", "C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.byycdL\\simutransworldmonitorserver-manifest.exe"])
"C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin\swift-frontend.exe" -frontend -c -primary-file D:\Documents\simutrans_world_monitor_2\SimutransWorldMonitorServer\Package.swift -target x86_64-unknown-windows-msvc -disable-objc-interop -sdk D:\Documents\swiftsdk -I "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\pm\ManifestAPI" -vfsoverlay "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.Y7nJjr\vfs.yaml" -swift-version 6 -package-description-version 6.0.0 -empty-abi-descriptor -resource-dir "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift" -module-name main -in-process-plugin-server-path "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin\SwiftInProcPluginServer.dll" -plugin-path "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin" -plugin-path "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\local\bin" -o "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.ZR5DeU\Package-1.o"
"C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin\clang.exe" --rsp-quoting=windows -target x86_64-unknown-windows-msvc -nostartfiles -L "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\windows" -L "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\windows\x86_64" -L D:\Documents\swiftsdk\usr\lib\swift\windows -L D:\Documents\swiftsdk\usr\lib\swift\windows\x86_64 D:\Documents\swiftsdk\usr\lib\swift\windows\x86_64\swiftrt.obj "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.ZR5DeU\Package-1.o" -L "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\pm\ManifestAPI" -I D:\Documents\swiftsdk -v -o "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.byycdL\simutransworldmonitorserver-manifest.exe" -lPackageDescription
Swift version 6.1 (swift-6.1-RELEASE)
Target: x86_64-unknown-windows-msvc
error: link command failed with exit code 1120 (use -v to see invocation)
   ライブラリ C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.byycdL\simutransworldmonitorserver-manifest.lib とオブジェクト C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.byycdL\simutransworldmonitorserver-manifest.exp を作成中
Package-1.o : error LNK2019: 未解決の外部シンボル memcpy が関数 main で参照されました
LINK : error LNK2001: 外部シンボル mainCRTStartup は未解決です
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\lib\x86\msvcrt.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\lib\x86\msvcprt.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています
C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.byycdL\simutransworldmonitorserver-manifest.exe : fatal error LNK1120: 2 件の未解決の外部参照
clang version 19.1.4
Target: x86_64-unknown-windows-msvc
Thread model: posix
InstalledDir: C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin
Build config: +assertions
 "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\bin\\Hostx64\\x64\\link.exe" "-out:C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.byycdL\\simutransworldmonitorserver-manifest.exe" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\windows" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\windows\\x86_64" "-libpath:D:\\Documents\\swiftsdk\\usr\\lib\\swift\\windows" "-libpath:D:\\Documents\\swiftsdk\\usr\\lib\\swift\\windows\\x86_64" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\pm\\ManifestAPI" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\clang\\19\\lib\\x86_64-unknown-windows-msvc" -nologo "D:\\Documents\\swiftsdk\\usr\\lib\\swift\\windows\\x86_64\\swiftrt.obj" "C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.ZR5DeU\\Package-1.o" PackageDescription.lib
clang: error: linker command failed with exit code 1120 (use -v to see invocation)
error: 'simutransworldmonitorserver': Invalid manifest (compiled with: ["C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\bin\\swiftc.exe", "-vfsoverlay", "C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.SBNHwU\\vfs.yaml", "-L", "C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\pm\\ManifestAPI", "-lPackageDescription", "-sdk", "D:\\Documents\\swiftsdk", "-libc", "MD", "-swift-version", "6", "-I", "C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\pm\\ManifestAPI", "-package-description-version", "6.0.0", "D:\\Documents\\simutrans_world_monitor_2\\SimutransWorldMonitorServer\\Package.swift", "-v", "-o", "C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.Dq06VQ\\simutransworldmonitorserver-manifest.exe"])
"C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin\swift-frontend.exe" -frontend -c -primary-file D:\Documents\simutrans_world_monitor_2\SimutransWorldMonitorServer\Package.swift -target x86_64-unknown-windows-msvc -disable-objc-interop -sdk D:\Documents\swiftsdk -I "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\pm\ManifestAPI" -vfsoverlay "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.SBNHwU\vfs.yaml" -swift-version 6 -package-description-version 6.0.0 -empty-abi-descriptor -resource-dir "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift" -module-name main -in-process-plugin-server-path "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin\SwiftInProcPluginServer.dll" -plugin-path "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin" -plugin-path "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\local\bin" -o "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.dDLDpt\Package-1.o"
"C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin\clang.exe" --rsp-quoting=windows -target x86_64-unknown-windows-msvc -nostartfiles -L "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\windows" -L "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\windows\x86_64" -L D:\Documents\swiftsdk\usr\lib\swift\windows -L D:\Documents\swiftsdk\usr\lib\swift\windows\x86_64 D:\Documents\swiftsdk\usr\lib\swift\windows\x86_64\swiftrt.obj "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.dDLDpt\Package-1.o" -L "C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\lib\swift\pm\ManifestAPI" -I D:\Documents\swiftsdk -v -o "C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.Dq06VQ\simutransworldmonitorserver-manifest.exe" -lPackageDescription
Swift version 6.1 (swift-6.1-RELEASE)
Target: x86_64-unknown-windows-msvc
error: link command failed with exit code 1120 (use -v to see invocation)
   ライブラリ C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.Dq06VQ\simutransworldmonitorserver-manifest.lib とオブジェクト C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.Dq06VQ\simutransworldmonitorserver-manifest.exp を作成中
Package-1.o : error LNK2019: 未解決の外部シンボル memcpy が関数 main で参照されました
LINK : error LNK2001: 外部シンボル mainCRTStartup は未解決です
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\lib\x86\msvcrt.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\lib\x86\msvcprt.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています
C:\Users\AKIMUH~1\AppData\Local\Temp\TemporaryDirectory.Dq06VQ\simutransworldmonitorserver-manifest.exe : fatal error LNK1120: 2 件の未解決の外部参照
clang version 19.1.4
Target: x86_64-unknown-windows-msvc
Thread model: posix
InstalledDir: C:\Users\Akimu Hirai\AppData\Local\Programs\Swift\Toolchains\6.1.0+Asserts\usr\bin
Build config: +assertions
 "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.43.34808\\bin\\Hostx64\\x64\\link.exe" "-out:C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.Dq06VQ\\simutransworldmonitorserver-manifest.exe" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\windows" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\windows\\x86_64" "-libpath:D:\\Documents\\swiftsdk\\usr\\lib\\swift\\windows" "-libpath:D:\\Documents\\swiftsdk\\usr\\lib\\swift\\windows\\x86_64" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\swift\\pm\\ManifestAPI" "-libpath:C:\\Users\\Akimu Hirai\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.1.0+Asserts\\usr\\lib\\clang\\19\\lib\\x86_64-unknown-windows-msvc" -nologo "D:\\Documents\\swiftsdk\\usr\\lib\\swift\\windows\\x86_64\\swiftrt.obj" "C:\\Users\\AKIMUH~1\\AppData\\Local\\Temp\\TemporaryDirectory.dDLDpt\\Package-1.o" PackageDescription.lib
clang: error: linker command failed with exit code 1120 (use -v to see invocation)

FYI: The code I'm trying to run the test is simutrans_world_monitor_2/SimutransWorldMonitorServer at main · teamhimeh/simutrans_world_monitor_2 · GitHub

That is likely because you are using the wrong Developer Command Prompt. You should be using the "Native Developer Command Prompt" which should give you x64 rather than the "x86 Native Tools Command Prompt" or "x64_x86 Developer Command Prompt".

It is interesting that -use-ld=lld is missing. That is really what we should be aiming to repair. The intention there is to avoid the need for the proper developer command prompt being required.

When I try it I get:

C:\Users\dschaefer2\tmp\simutrans_world_monitor_2\SimutransWorldMonitorServer\.build\checkouts\swift-nio\Sources\CNIOSHA1\c_nio_sha1.c:64:2: error: "BYTE_ORDER not defined"
   64 | #error "BYTE_ORDER not defined"
      |  ^

Which is a build error in swift-nio. This is an interesting server application, however my understanding is that swift-nio doesn't work on Windows. So this may not work in the end anyway. But that's is something we should fix.

Using x64 native tools command prompt brought me to the Swift NIO build error. Thank you. I didn't know that Swift NIO, a dependency of Discord-BM, does not work on Windows. Since it is the library limitation, let me end my journey to build my swift application on windows here. Thank you everyone for supporting me :man_bowing:

1 Like