使用Bazel与MSVC在x86架构编译DLL却生成x64文件的求助
在Bazel中使用MSVC编译x86架构C++ DLL的正确配置
你的核心问题在于Bazel的CPU架构参数配置错误,以及手动链接选项的冲突,以下是具体解决步骤:
1. 修正bazelrc中的CPU参数
你当前使用的x64_x86_windows是旧版交叉编译标识,Bazel目前推荐直接指定目标架构为x86_windows,同时主机架构(构建工具运行的架构)设为当前机器的实际架构(如果你的开发机是x64,就写x64_windows)。修改后的bazelrc配置如下:
build:relwithdebinfo --cxxopt=/std:c++14 build:relwithdebinfo --copt=/DWIN32 build:relwithdebinfo --copt=/D_WINDOWS build:relwithdebinfo --cpu=x86_windows build:relwithdebinfo --host_cpu=x64_windows
配置正确后,Bazel会自动调用MSVC的x86版本编译工具链,而非强制用x64工具链编译x86代码。
2. 移除手动添加的链接选项
你在cc_binary中添加的/MACHINE:X86会被Bazel工具链的自动配置覆盖,甚至可能引发冲突,直接删除这一行即可。正确指定CPU参数后,工具链会自动传递对应的/MACHINE参数给链接器。
3. 确认MSVC x86工具组件已安装
打开Visual Studio Installer,确保在「Desktop development with C++」工作负载下勾选了MSVC vXXX - VS 20XX C++ x86/x64 build tools(包含x86目标的编译工具集),如果未安装,补充安装后再重新构建。
4. 清理缓存并重新构建
旧的x64构建缓存可能导致配置不生效,执行以下命令彻底清理后重新构建:
bazel clean --expunge bazel build --config=relwithdebinfo //your/package:target_dll
替换//your/package:target_dll为你实际的DLL目标标签。
5. 验证结果
使用dumpbin检查最终生成的DLL:
dumpbin /headers path/to/your_generated.dll | findstr "machine"
正常情况下会输出14C machine (x86),表示这是标准的x86架构DLL。
内容的提问来源于stack exchange,提问作者Ferry
相关产品推荐
相关产品推荐

