如何在Windows系统中成功执行npm i ssh2安装?或如何跳过cpu-features编译避免报错?
解决Windows下
npm i ssh2的编译报错问题 先还原你遇到的编译报错信息:
MSVCRT.lib(chandler4gs.obj) : error LNK2019: unresolved external symbol __except_handler4_common referenced in function __except_handler4 [c:\xxxxxxx\git\sdk\v2\master\node_modules\yyyy\node_modules\cpu-features\build\cpufeatures.vcxproj] c:\xxxxxxx\git\sdk\v2\master\node_modules\yyyy\node_modules\cpu-features\build\Release\cpufeatures.node : fatal error LNK1120: 1 unresolved externals [c:\SAPDevelop\git\sdk\v2\master\node_modules\irpa_core\node_modules\cpu-features\build\cpufeatures.vcxproj]
你已经精准定位到问题根源:cpu-features模块的编译选项冲突——cpufeatures.node采用/MT(静态链接C/C运行时)编译,但它依赖的cpu_features.lib和utils.lib用的是/MD(动态链接C/C运行时),而Windows Visual Studio环境要求链接到DLL的所有库必须使用一致的运行时选项。下面针对你的两个问题给出具体解决办法:
问题1:如何在Windows系统中成功完成npm i ssh2安装?
考虑到你不熟悉CMake,这里提供两种无需手动修改VS项目的可行方案:
方法1:通过环境变量强制CMake统一编译选项
在执行npm i ssh2之前,先设置CMake的全局编译选项,让所有生成的项目默认使用静态链接运行时:
set CMAKE_C_FLAGS=/MT set CMAKE_CXX_FLAGS=/MT npm i ssh2
这样CMake在构建cpu-features时,会自动把所有目标的链接选项统一设为/MT,从根源避免运行时链接冲突。
方法2:修改cpu-features的CMake配置(适合长期复用场景)
- 先单独拉取
cpu-features的代码到本地:git clone https://github.com/mscdex/cpu-features.git cd cpu-features - 打开项目根目录下的
CMakeLists.txt,找到所有设置编译选项的行,把/MD替换成/MT:- 比如找到
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD"),改成set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") - 同样处理
CMAKE_C_FLAGS_DEBUG等其他编译模式的配置
- 比如找到
- 将修改后的
cpu-features作为本地依赖安装到你的项目:cd 你的项目根目录 npm install ../cpu-features npm i ssh2
问题2:如何在执行npm i ssh2时跳过cpu-features的编译步骤?
cpu-features是ssh2的可选依赖,仅用于CPU特性优化,跳过它完全不影响ssh2的核心功能。你可以通过以下几种方式实现:
方法1:使用npm的--no-optional参数
直接执行命令,跳过所有可选依赖的安装与编译:
npm i ssh2 --no-optional
方法2:设置环境变量禁用cpu-features构建
cpu-features支持通过环境变量直接跳过编译流程:
set CPU_FEATURES_DISABLE=1 npm i ssh2
方法3:修改项目package.json(适合长期固定配置)
在你的项目package.json中添加覆盖配置,明确排除cpu-features:
"optionalDependencies": { "cpu-features": false }
之后执行npm i就会自动跳过该依赖的处理。
内容的提问来源于stack exchange,提问作者manuell
相关产品推荐
相关产品推荐

