2013-11-04 96 views
0

我正在嘗試使用msbuild和Visual Studio命令中提供的其他命令從另一個Visual C++程序(project2)編譯並運行一個visual C++程序(project1)而不是在Windows命令行工具中。一切工作正常,如果我在Visual Studio命令行工具中運行它。例如,我可以使用msbuild來構建,它可以像我希望的那樣工作。當我嘗試使用system()在我的C++程序中運行相同的命令時,系統調用似乎使用Windows命令行,因此找不到任何命令(本例中爲msbuild)。我對在windows上使用system()很陌生(儘管我使用Linux有豐富的經驗)。當我調用system(而不是Windows命令行環境)時,是否有某種方法可以讓我的C++程序使用Visual Studio命令行環境? 手動使用命令窗口不是一個選項。我需要在project1中編譯和測試一系列200-300個不同版本的程序。這就是爲什麼我要編寫程序2如何使用Visual Studio 2012命令行工具從系統()

回答

1

從命令行獲得Visual Studio的關鍵是設置合適的環境。您可能安裝了多個不同的VS版本,因此您需要指定使用哪一個版本。這樣做最簡單的方法可能是具有一定程度的間接性,您可以在其中生成一系列命令來設置所需的環境,並將其寫入批處理文件,然後調用system()來運行該環境。

如果你看看<visual studio>\vc\bin目錄,那麼你會發現一個文件vcvars32.bat。這爲設置特定工具集的環境提供了很多魔力。我想,那麼你可以生成一個批處理文件是這樣的:

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

msbuild myproject 

請注意,您所需要的call語法來調用從另一個批處理文件,否則會導致外殼有來​​無回。

1
  1. 通過查找以下注冊表項中找到msbuild.exe: HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的MSBuild \ ToolsVersions \ 4.0 \ MSBuildToolsPath
  2. 呼叫路徑\使用從上面
  3. 註冊表項的路徑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; 
} 
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 
相關問題