我需要从构建不同版本的应用程序的同一 bash 脚本 (msys) 中调用 vcvars32.bat 和 vcvars64.bat。
问题是,即使我能够使用 cmd.exe 命令调用批处理文件,一旦它返回 Visual Studio 变量显然没有设置。
我无法从调用 bash 脚本的外部批处理文件(如 msys.bat)调用 vcvars,因为我需要在同一个脚本中按顺序调用它们。
那么,有没有办法调用 vcvars 以便在运行时正确设置 bash 脚本中的变量?
我需要从构建不同版本的应用程序的同一 bash 脚本 (msys) 中调用 vcvars32.bat 和 vcvars64.bat。
问题是,即使我能够使用 cmd.exe 命令调用批处理文件,一旦它返回 Visual Studio 变量显然没有设置。
我无法从调用 bash 脚本的外部批处理文件(如 msys.bat)调用 vcvars,因为我需要在同一个脚本中按顺序调用它们。
那么,有没有办法调用 vcvars 以便在运行时正确设置 bash 脚本中的变量?
解决此问题的一种方法是从 vcvars 环境中运行命令,而不是尝试将其导出回 bash 端。这就是我们为项目选择的方法。
主要问题是它vcvars*.bat
不接受在环境中执行的命令,因此需要使用 cmd 进行一些技巧。所以我想出了一个简单的 Bash 脚本vcvars_env_run.sh
,它接受任意参数并将它们转发到vcvars64.bat
已调用的 cmd.exe。大部分工作是弄清楚如何正确转发带引号的参数,以及 &&、||、返回码等。
我已经在https://github.com/kromain/wsl-utils上传了脚本和一些示例
您可能需要稍微调整一下才能在 和 之间切换vcvars32.bat
,vcvars64.bat
但希望它对您尝试做的事情有所帮助。
POSIX shellexport -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"
Cygwin 本机进程调用子系统的限制(参数引用是启发式完成的)使得这个辅助文件是必要的。
您需要做的是在批处理脚本中使用命令:“call”。所以它可能看起来像:
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
echo DevEnvDir set to: %DevEnvDir%
如果您不使用“调用”,则脚本将在 vcvars32.bat 退出后退出,并且不会运行任何其他命令。