尝试通过 c++ 程序中的 system() 函数使用 cl Visual Studio 命令进行命令行构建时出现 vcvars32.bat 问题
Posted
技术标签:
【中文标题】尝试通过 c++ 程序中的 system() 函数使用 cl Visual Studio 命令进行命令行构建时出现 vcvars32.bat 问题【英文标题】:Issue with vcvars32.bat when trying to use cl Visual Studio command for command line build via the system() function in a c++ program 【发布时间】:2020-08-02 00:13:21 【问题描述】:我正在尝试从另一个 c++ 程序中编译生成的 cpp 文件。
首先(查看 cl 命令是否有效)我正在尝试使用来自 c++ 程序的 Visual Studio 命令行构建,如下所示:
命令("cl");
由于 c++ 命令提示符不是本机工具命令提示符,我首先调用:
command("C:"/Program Files (x86)/Microsoft Visual\Studio/2019/Community/VC/Auxiliary/Build/vcvars32.bat"");
这似乎执行得很好,具有预期的输出。但是,当我得到后进行 cl 调用时:
'cl' 未被识别为内部或外部命令。
这与我没有调用 vcvars32.bat 的预期错误相同。
如果我从常规命令提示符执行完全相同的过程,一切正常,但不是来自我的 Visual Studio 2019 C++ 17 项目中的 c++ 程序 cmd。
我对它不起作用并不感到惊讶,我认为 C++ 项目的环境有些不同,尽管成功调用 vcvars32.bat 不会以所需的方式设置环境变量.
有谁确切地知道这可能取决于什么以及(如果可能)如何解决它?或者,如果您对如何从另一个 c++ 程序编译 c++ 项目有任何其他想法?
【问题讨论】:
什么是command()
?我假设每个 command
都会启动新的 shell 实例,因此每次运行都会获得初始环境。
试试C:"/Program Files (x86)/Microsoft Visual \ Studio/2019/Community/VC/Auxiliary/Build/vcvars32.bat" & cl ...
谢谢你,这似乎奏效了!我假设该命令是在同一个 shell 中完成的,因为结果是在同一个 VS 项目命令提示符中编写的。
【参考方案1】:
在我看来,cl
不在你的路上。您需要添加it。推荐的方法是启动开发人员命令提示符。 CL环境变量的设置方法可以参考link。
此外,您还需要设置工具集。如果您打开了一个普通的命令提示符窗口,您可以运行带有适当参数的批处理文件vcvarsall.bat
来设置环境变量。
在命令提示符下,切换到 Visual C++ 安装 目录。 (位置取决于系统和 Visual Studio 安装,但典型的位置是 C:\Program Files (x86)\Microsoft Visual Studio 版本\VC。)例如,输入:
cd "\Program Files (x86)\Microsoft Visual Studio 12.0\VC"
要为 32 位 x86 命令行构建配置此命令提示符窗口,请在命令提示符处输入:
vcvarsall x86
可能的参数如下:
x86 (x86 32-bit native)
x86_amd64 (x64 on x86 cross)
x86_arm (ARM on x86 cross)
amd64 (x64 64-bit native)
amd64_x86 (x86 on x64 cross)
amd64_arm (ARM on x64 cross)
如果运行vcvar32
时出现ERROR: Cannot determine the location of the VS Common Tools Folder
,可以检查环境变量PATH中是否有c:\windows\system32
。如果没有,您可以添加它。因为vcvar32
在运行的时候会调用一个叫reg
的命令。而这个reg
命令需要c:\windows\system32
。
【讨论】:
谢谢,但是,这看起来像是如何手动完成的答案。我试图做的是使用 c++ system() 函数通过 c++ 代码使用我的 VS 项目命令提示符。问题是 system() 在每次调用之间打开一个新的 shell。【参考方案2】:正如 S.M 指出的那样,我解决了这个问题,system() 在每次调用之间打开一个新的 shell。 我使用运算符 & 解决了它,并在 Paul Sanders 建议的同一系统调用中运行 vcvars32.bat 和 cl 命令。
【讨论】:
以上是关于尝试通过 c++ 程序中的 system() 函数使用 cl Visual Studio 命令进行命令行构建时出现 vcvars32.bat 问题的主要内容,如果未能解决你的问题,请参考以下文章
System::IntPtr 到 C++/CLI 中的 int*
在 c# System.AccessViolationException 处导出 c++ 函数和使用函数
从 PHP Web 应用程序调用 C++ 库:system() 与 SWIG PHP 扩展?