如何让CMake生成的C#项目取消Prefer 32-bit编译标志?
/platform:anycpu32bitpreferred的问题 遇到这种情况确实挺闹心的——CMake默认会给AnyCPU的C#项目加上32位优先的标志,直接导致和64位DLL的链接问题。不过有几个靠谱的方法能强制CMake生成不带这个烦人的标志的项目:
方法1:通过VS_GLOBAL_Prefer32Bit属性禁用32位优先
CMake允许通过VS_GLOBAL_前缀设置Visual Studio项目的全局属性,对于C#项目里的"Prefer 32-bit"复选框,对应的底层属性就是Prefer32Bit。你只需要在定义C#目标后,添加这段配置:
add_executable(YourCSharpApp WIN32 Form1.cs Form1.Designer.cs Program.cs # 其他你的C#源文件 ) # 取消"Prefer 32-bit"选项 set_target_properties(YourCSharpApp PROPERTIES VS_GLOBAL_Prefer32Bit false )
这个设置会直接在生成的.csproj文件中插入<Prefer32Bit>false</Prefer32Bit>,完全覆盖CMake的默认行为。重新生成项目后,你会发现VS里的"Prefer 32-bit"复选框已经被取消勾选,编译时也不会再出现/platform:anycpu32bitpreferred这个标志了。
方法2:直接修改CMAKE_CSharp_FLAGS指定编译平台
如果你想更直接地控制编译参数,可以修改CMAKE_CSharp_FLAGS,明确指定/platform:anycpu:
# 一定要在定义C#目标之前设置 set(CMAKE_CSharp_FLAGS "/platform:anycpu") add_executable(YourCSharpApp WIN32 ...)
要是你之前已经给C#项目加了其他编译标志(比如警告等级/warn:4),记得把新选项和原有标志合并,别覆盖掉:
set(CMAKE_CSharp_FLAGS "${CMAKE_CSharp_FLAGS} /platform:anycpu")
方法3:直接指定目标平台为x64(可选方案)
如果你的场景里不需要AnyCPU,而是明确要64位程序,那更简单——直接指定C#项目的目标平台为x64,这样CMake就不会碰AnyCPU相关的32位优先设置了:
set_target_properties(YourCSharpApp PROPERTIES VS_GLOBAL_PlatformTarget x64 )
这样生成的项目会直接以x64为目标平台,和你的64位DLL完美兼容,彻底绕开AnyCPU的坑。
验证效果
配置完之后,重新运行CMake生成VS项目,打开项目属性检查:
- 转到"生成"选项卡,确认"首选32位"没被勾选
- 点开"高级"生成设置,确认"目标平台"是AnyCPU(或x64,如果你用了方法3),没有额外的32位优先标记
这样编译出来的C#程序就能正常加载64位DLL啦。
内容的提问来源于stack exchange,提问作者MrD

