0

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

4

3 回答 3

1
  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;
}
于 2013-11-04T17:31:12.377 回答
1

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

如果你查看<visual studio>\vc\bin目录,你会发现一个文件vcvars32.bat。这在为特定工具集设置环境方面发挥了很大作用。我认为您可以生成这样的批处理文件:

call path\to\visualstudio\vc\bin\vcvars32.bat

msbuild myproject

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

于 2013-11-04T16:52:33.483 回答
0

使用其中之一怎么样?

%windir%\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe
%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
于 2013-11-04T21:51:34.957 回答