如何从 system() 使用 Visual Studio 2012 命令行工具
How to use the Visual Studio 2012 command line tool from system()
我正在尝试使用 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 不返回。
- 通过查找以下注册表项找到 msbuild.exe:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath
- 调用 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
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- Visual Studio mkl_link_tool.exe链接错误
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 不同的Visual Studio版本中缺少.dll
- 用Visual Studio在C++中嵌入Julia
- Visual Studio 2017循环自动向量化问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- Visual Studio在尝试读取resource.txt文件时崩溃
- Visual Studio 2017 不允许我创建 C++ 专用模板