如何从 system() 使用 Visual Studio 2012 命令行工具

How to use the Visual Studio 2012 command line tool from system()

本文关键字:Studio Visual 2012 命令行 工具 使用 system      更新时间:2023-10-16

我正在尝试使用 msbuild 和 Visual studio 命令行工具中可用的其他命令(项目2)编译和运行另一个可视化C++C++程序 (project1),但不在 Windows 命令行工具中。如果我在 Visual Studio 命令行工具中运行它,一切正常。例如,我可以使用 msbuild 进行构建,它就像我想要的那样工作。当我尝试使用 system() 在C++程序中运行相同的命令时,系统调用似乎使用 Windows 命令行,因此找不到任何命令(在本例中为 msbuild)。 我是Windows上使用system()的新手(尽管我在使用Linux方面有丰富的经验)。 有没有办法让我的C++程序在调用系统(而不是Windows命令行环境)时使用Visual Studio命令行环境?手动使用命令窗口不是一个选项。 我需要在项目中编译和测试一系列 200-300 个不同版本的程序1。 这就是我编写程序的原因2

让Visual Studio从命令行构建的关键是设置适当的环境。 您可能安装了多个不同的 VS 版本,因此您需要一种方法来指定要使用的版本。 执行此操作的最简单方法可能是具有间接级别,您可以在其中生成命令列表以设置所需的环境并将其写入批处理文件,然后调用system()来运行该命令。

如果您查看<visual studio>vcbin目录,那么您会找到一个文件vcvars32.bat。这为特定工具集设置环境有很多魔力。 我认为您可以生成这样的批处理文件:

call pathtovisualstudiovcbinvcvars32.bat
msbuild myproject

请注意,您需要call语法才能从一个批处理文件调用另一个批处理文件,否则会导致 shell 不返回。

  1. 通过查找以下注册表项找到 msbuild.exe:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
  2. 调用 PATH\msbuild.exe使用上述注册表项中的路径

这种方法不需要知道Visual Studio的路径,事实上,即使没有安装MSVS,它也可以工作 - [免费] .NET SDK 4.0就足够了。

下面是一个示例代码,它将找到 msbuild.exe并运行它:

#include "windows.h"
#include "winreg.h"
#define MAXSZ 1024
int _tmain(int argc, _TCHAR* argv[])
{
    HKEY key;
    TCHAR path[MAXSZ];
    DWORD dwSize = MAXSZ;
    long result;
    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0" ), 0, KEY_QUERY_VALUE, &key);
    result = RegQueryValueEx(key, _T("MSBuildToolsPath"), 0, NULL, (LPBYTE)path, &dwSize);
    wcscat_s(path, MAXSZ, _T("msbuild.exe"));
    _wsystem(path);
    return 0;
}

使用其中之一怎么样?

%windir%Microsoft.NETFrameworkv2.0.50727MSBuild.exe
%windir%Microsoft.NETFrameworkv3.5MSBuild.exe
%windir%Microsoft.NETFrameworkv4.0.30319MSBuild.exe