我需要在同一个bash脚本(msys)中调用vcvars32.bat和vcvars64.bat,以构建我的应用程序的不同版本。问题是,即使我能够使用cmd.exe命令调用批处理文件,一旦它返回,Visual Studio变量显然没有设置。我不能从外部批处理文件(如msys.bat)中调用vcvars,该批处理文件调用bash脚本,因为我需要在同一个脚本中按顺序调用它们两个。那么,有没有办法调用vcvars以正确设置bash脚本中正在运行的变量?
vcvars*.bat
不接受在环境中执行的命令,因此需要使用cmd进行一些技巧性操作。我编写了一个名为vcvars_env_run.sh
的简单Bash脚本,它接受任意参数并将其转发到已调用vcvars64.bat
的cmd.exe上。大部分工作是找出如何正确转发带引号的参数,以及像&&、||、返回代码等等的东西。vcvars32.bat
和vcvars64.bat
之间切换,但希望它对您尝试做的事情有所帮助。vcvars*
脚本运行吗?在我的系统上,每次都要等待几秒钟,非常烦人。 :-/ - SO_fix_the_vote_sorting_bugPOSIX shell的export -p
命令会打印出所有环境变量的值,以便通过eval
命令重新创建这些值。其思路是在vcvars*.bat
运行后从子shell中调用此命令,并在顶层脚本中eval
捕获的输出。
Cygwin环境变量设置脚本可以按以下方式获取vcvars*.bat
的结果:
eval "$($(cygpath "$COMSPEC") /c vcvars_export "$vcvars_bat" "$(
cygpath -w "$SHELL")")"
其中vcvars_bat
包含相关vcvars*.bat
文件的路径。您可以在x64 Native Tools Command Prompt for VS 2019.lnk
文件的目标中找到此值,该文件可以使用readlink -t
读取。(还要注意,vcvarsall.bat
脚本允许指定要使用的编译器和SDK版本,在需要精确控制时非常有用)。
本地的vcvars_export.bat
文件包含
@echo off
call %1 > nul
"%2" -c "export -p"
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
echo DevEnvDir set to: %DevEnvDir%
如果您不使用“call”,则在vcvars32.bat退出后,脚本将退出并且不会运行任何其他命令。