VS2017含版本资源的C++ DLL用MSBuild构建报LNK1158错误
我之前也碰到过类似的情况——VS IDE里编译完全正常,但普通权限下用MSBuild命令行构建带版本资源的项目就触发LNK1158错误,换管理员权限却能正常运行。结合你的场景(VS2017专业版、带.rc版本资源的C++ DLL),这问题基本和权限限制或者环境变量配置不全脱不了干系,给你几个靠谱的解决思路:
别用普通cmd,改用VS开发者命令提示符
普通命令提示符不会自动加载VS的全套环境变量,导致MSBuild找不到cvtres.exe的正确路径。直接从开始菜单的「Visual Studio 2017」文件夹里打开「Developer Command Prompt for VS 2017」,在这个窗口里执行你的MSBuild命令,它会自动配置好所有VS工具的路径,大概率直接解决问题。检查cvtres.exe的用户权限
先找到cvtres.exe的位置,一般路径类似C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\BuildTools\bin\Hostx86\x86(根据你的系统位数和VS安装路径调整)。右键点击该文件→「属性」→「安全」选项卡,确认当前普通用户拥有「读取和执行」的权限,如果没有,点击「编辑」添加对应的权限——毕竟管理员能正常运行,大概率是普通用户权限不足导致的。手动给cmd补充环境变量(临时方案)
要是不想使用开发者命令提示符,可以在普通cmd里先手动将cvtres.exe所在路径添加到临时环境变量中:set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\BuildTools\bin\Hostx86\x86;%PATH%执行完这条命令后再运行MSBuild,就能让它找到cvtres.exe了。
修复VS安装,排查组件损坏
有时候VS的组件可能出现莫名损坏,导致工具路径注册异常。打开VS Installer,选中你的VS2017专业版,点击「修改」→「修复」,等待修复完成后再尝试构建——这种方法虽然看似繁琐,但能解决不少奇奇怪怪的工具调用问题。临时调低UAC测试(谨慎操作)
如果以上方法都无效,可能是用户账户控制(UAC)限制了普通用户调用系统目录下的工具。你可以暂时降低UAC级别(控制面板→用户账户→更改用户账户控制设置),测试普通权限下能否正常运行。测试完成后记得调回原来的级别,避免系统暴露不必要的安全风险。
优先尝试前两个方案,它们覆盖了最常见的问题成因,应该能快速解决你的困扰。
内容的提问来源于stack exchange,提问作者andrea l

