Windows下CMake通过SSH克隆Git仓库失败,主机密钥验证错误如何解决?
现有一个通过CMake构建的C程序,在Linux和macOS平台可正常编译。在Windows环境下执行cmake -G "Unix Makefiles" ..进行交叉编译时,CMake配置过程中通过SSH克隆依赖库的步骤报错:
Host key verification failed.
fatal: Could not read from remote repository.
已尝试通过ssh-add将SSH密钥添加到SSH代理,但问题未解决。补充:Windows命令行中可正常克隆目标仓库,仅CMake执行时出现该错误。
- CMake使用
Unix Makefiles生成器时,默认调用MSYS2/Cygwin类的Unix风格环境,和Windows原生命令行(CMD/PowerShell)的SSH环境、环境变量不共享,导致密钥、主机信任列表无法被CMake进程读取。 - CMake进程未继承SSH代理的环境变量(如
SSH_AUTH_SOCK),无法访问已添加的密钥。 - 目标主机的公钥未被CMake使用的SSH环境信任,未写入对应环境下的
known_hosts文件。
统一CMake使用的SSH/Git环境:
在CMake配置时,强制指定使用Windows原生的Git或SSH路径,可通过命令行参数或在CMakeLists.txt中设置:# 在CMakeLists.txt开头添加 set(GIT_EXECUTABLE "C:/Program Files/Git/bin/git.exe") set(CMAKE_SSH_COMMAND "C:/Windows/System32/OpenSSH/ssh.exe")或执行cmake时传入参数:
cmake -G "Unix Makefiles" -DGIT_EXECUTABLE="C:/Program Files/Git/bin/git.exe" -DCMAKE_SSH_COMMAND="C:/Windows/System32/OpenSSH/ssh.exe" ..手动信任目标主机公钥:
打开CMake所依赖的Unix风格终端(如MSYS2 Bash),手动执行一次依赖库的SSH克隆命令,完成主机公钥的信任确认,公钥会被写入该环境下的~/.ssh/known_hosts文件,后续CMake即可正常读取。确保CMake继承SSH代理环境:
从已启动SSH代理的Windows命令行(CMD/PowerShell)中执行cmake命令,避免从CMake GUI或未加载代理的终端启动。可先在命令行中执行echo %SSH_AUTH_SOCK%确认代理环境变量存在后,再运行cmake。强制指定SSH密钥文件:
在CMakeLists.txt中直接指定SSH密钥路径,跳过代理查找:set(CMAKE_SSH_FLAGS "-i C:/Users/你的用户名/.ssh/id_rsa")
内容的提问来源于stack exchange,提问作者solick

