如何在Visual Studio 2019中无需硬编码路径引用link.exe?
解决VS2019预生成事件中link.exe路径硬编码问题的方案
不用再头疼VS更新导致MSVC版本路径变化的问题了,这里有几个不用硬编码就能自动找到link.exe的实用方法:
方法一:使用VS内置的工具链路径变量
Visual Studio的构建系统已经为不同架构的工具链预设了环境变量,直接用这些变量就能定位到对应版本的link.exe:
针对你当前的Hostx86/x86架构,直接用$(VC_ExecutablePath_x86_x86)变量替换硬编码路径即可,修改后的命令行如下:
"$(VC_ExecutablePath_x86_x86)\link.exe" /MACHINE:x86 /VERBOSE /NOENTRY /DLL /OUT:"$(ProjectDir)$(OutDir)$(TargetName).ribbon.dll" "$(ProjectDir)RibbonMarkup.res"
这个变量会自动匹配当前VS安装的MSVC版本路径,不管后续VS怎么更新,路径都会同步调整,完全不用手动修改。
如果需要其他架构的工具链,对应的变量也有:
- x64主机+ x64目标:
$(VC_ExecutablePath_x64_x64) - x86主机+ x64目标:
$(VC_ExecutablePath_x86_x64)
方法二:通过vcvarsall.bat初始化环境后直接调用link.exe
VS提供了vcvarsall.bat脚本,用来初始化对应工具链的环境变量,执行这个脚本后,link.exe会被自动加入系统PATH,直接调用即可:
修改后的预生成事件命令如下:
call "$(VSInstallDir)\VC\Auxiliary\Build\vcvarsall.bat" x86 link.exe /MACHINE:x86 /VERBOSE /NOENTRY /DLL /OUT:"$(ProjectDir)$(OutDir)$(TargetName).ribbon.dll" "$(ProjectDir)RibbonMarkup.res"
$(VSInstallDir)是VS的安装目录变量,会自动指向你的VS2019 Community版安装路径- 脚本后的
x86参数指定了要初始化的工具链架构,根据你的需求修改即可(比如x64)
这种方法的优势是通用性极强,不管是哪个版本的MSVC,只要VS安装正常,脚本就能正确配置环境。
方法三:直接使用MSBuild的LinkExe属性
如果你的项目是基于MSBuild构建的,还可以直接使用$(LinkExe)属性,这个属性已经包含了link.exe的完整路径,命令会更简洁:
"$(LinkExe)" /MACHINE:x86 /VERBOSE /NOENTRY /DLL /OUT:"$(ProjectDir)$(OutDir)$(TargetName).ribbon.dll" "$(ProjectDir)RibbonMarkup.res"
不过需要注意,这个属性的可用性可能和项目类型有关,如果你不确定,可以先在预生成事件里加一句echo $(LinkExe)测试输出路径是否正确。
小提示
在修改预生成事件后,可以先执行一次生成,查看输出窗口的日志,确认link.exe的路径是否正确加载,避免出现意外错误。
内容的提问来源于stack exchange,提问作者fsbflavio




