如何在Cygwin环境下让CMake正确调用MS Visual C++编译器
问题根因
你使用了Cygwin环境下CMake默认的Unix Makefiles生成器,该生成器默认按照GCC/Clang的参数规则生成编译命令:比如用-o指定输出文件路径、传递Cygwin风格的POSIX路径,和MSVC cl.exe的参数规则、Windows路径规则完全不兼容,因此出现参数识别失败、找不到源文件的报错。
解决方案
方案1:使用Visual Studio原生生成器(推荐)
该方案无需依赖Cygwin环境,适配性最好:
- 打开MSVC 2019对应架构的原生命令行工具:例如32位编译选「x86 Native Tools Command Prompt for VS 2019」,64位编译选「x64 Native Tools Command Prompt for VS 2019」
- 切换到你的项目根目录,执行CMake命令指定生成器:
# 32位构建 cmake -S . -B build -G "Visual Studio 16 2019" -A Win32 # 64位构建替换-A参数为 x64 - 执行构建命令:
cmake --build build --config Release
方案2:在Cygwin环境下使用NMake生成器
如果必须保留Cygwin终端操作流程,可按以下步骤配置:
- 首先在Cygwin终端中导入MSVC的编译环境变量,执行以下命令:
cmd /c "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars32.bat && set" | grep -v "^::" | while IFS='=' read -r k v; do export "$k=$(cygpath -u "$v" 2>/dev/null || echo "$v")"; done # 64位构建将上面的vcvars32.bat替换为vcvars64.bat - 执行CMake命令指定NMake生成器:
cmake -S . -B build -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release - 执行构建命令:
nmake
注意事项
- 不要只修改
CC/CXX变量而不更换生成器,默认Unix Makefiles生成器的参数规则完全不兼容MSVC - 若强行要使用
Unix Makefiles生成器,需要自行编写CMake工具链文件,重写编译命令模板、路径转换规则,适配成本极高,不推荐普通用户使用
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

