Visual Studio 2019 x86编译Protocol Buffer报错问题求助
- 编译目标:基于Visual Studio 2019编译x86版本ProtocolBuffer
- 初始执行的Release编译cmake命令如下:
cmake -G "NMake Makefiles" ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_GENERATOR_PLATFORM=Win32 ^ -DCMAKE_INSTALL_PREFIX=C:\protocolbuffers\install ^ C:\protocolbuffers\protobuf
- 执行上述命令触发两类报错:
- 配置阶段直接报错:
CMake Error at CMakeLists.txt:24 (project): Generator
NMake Makefilesdoes not support platform specification, but platform
Win32was specified.
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
- 移除
-DCMAKE_GENERATOR_PLATFORM=Win32 ^参数后配置可通过,但编译阶段报错中断:
protocolbuffers\protobuf\src\google\protobuf\extension_set_unittest.cc(871):
note: see reference to function template instantiation 'int google::protobuf::internal::RepeatedFieldLowerClampLimit<int64_t,4>(void)' being compiled
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe"' : return code '0x2' Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX86\x86\nmake.exe"' : return code '0x2' Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX86\x86\nmake.exe"' : return code '0x2' Stop.
- 预期编译产出:
静态库文件:
libprotobuf.lib、libprotobuf-lite.lib、libprotoc.lib
可执行程序:protoc.exe
NMake Makefiles是单配置生成器,本身不支持CMAKE_GENERATOR_PLATFORM参数,该参数仅对Visual Studio这类多配置生成器生效。- 未加载VS x86编译环境时直接在普通命令行执行cmake,无法识别MSVC编译器路径,触发编译器未设置的报错。
- 默认编译配置会包含单元测试模块,x86环境下测试代码存在已知编译问题,触发编译中断。
- 启动对应编译环境命令行
从Windows开始菜单找到x86 Native Tools Command Prompt for VS 2019启动,禁止使用普通cmd、PowerShell窗口操作,该专用命令行会自动加载x86架构所需的MSVC编译器、Windows SDK环境变量,从根源避免编译器找不到的问题。 - 创建独立编译目录
执行以下命令进入protobuf源码路径,创建单独的build目录隔离编译中间文件,避免污染源码目录:cd C:\protocolbuffers\protobuf mkdir build_x86 cd build_x86 - 执行cmake配置
NMake生成器的目标架构由启动的命令行环境决定,不需要额外传平台参数,同时关闭测试、示例等非必要编译项规避编译错误:
关键参数说明:cmake -G "NMake Makefiles" ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_INSTALL_PREFIX=C:\protocolbuffers\install ^ -Dprotobuf_BUILD_TESTS=OFF ^ -Dprotobuf_BUILD_EXAMPLES=OFF ^ -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ^ ..-Dprotobuf_BUILD_TESTS=OFF:关闭单元测试编译,直接解决extension_set_unittest.cc的编译报错-Dprotobuf_BUILD_EXAMPLES=OFF:跳过示例代码编译,缩短编译耗时-Dprotobuf_MSVC_STATIC_RUNTIME=OFF:编译动态链接CRT的库文件,和VS默认项目配置匹配,如需静态链接CRT可将值改为ON
- 执行编译
配置无报错后,直接执行nmake命令启动编译:nmake - 安装产出文件
编译完成后执行安装命令,所有产出文件会自动复制到之前指定的安装目录:nmake install - 结果校验
进入C:\protocolbuffers\install路径,lib子目录下可找到三个目标lib文件,bin子目录下可找到protoc.exe,即编译完成。
内容的提问来源于stack exchange,提问作者Fantastic Umbrella

