2011-12-18 114 views
0

我正在嘗試編譯一些C++源文件,其中包含MSVC2008來自Java代碼的編譯器。例如。我有一個路徑到源文件和ms編譯器的路徑。我需要運行編譯器並獲取可執行文件路徑或錯誤狀態。但是我得到的所有東西都是「不包含路徑定義」錯誤和退出狀態2從Java代碼運行MSVC編譯器給出錯誤

用谷歌搜索一下給了我文件路徑,它修復了從原始cmd運行時出現此錯誤的路徑。但是,似乎Java有自己的環境,與運行ProcessBuilder的進程時的操作系統完全不同。

到目前爲止,我得到這個代碼:

compilerPath = String.format("\"C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin\\cl.exe\" \"%s\"", sourcePath); 

ProcessBuilder builder = new ProcessBuilder(compilerPath); 
Process process = builder.start(); 
builder.redirectErrorStream(true); 
process.waitFor(); 

這將返回exitValue == 2及以上的任何時候我運行它提到的錯誤。

這是如何解決的,所以我可以運行cl.exe並獲得我的可執行文件?

回答

0

訣竅是設置了ProcessBuilder及其Process「ES INCLUDELIB環境變量:

ProcessBuilder builder = new ProcessBuilder("cl.exe main.cpp /nologo".split("\\s+")); 
builder.redirectErrorStream(true); 
builder.environment().put("INCLUDE", "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\include;C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Include"); 
builder.environment().put("LIB", "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\lib;C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Lib"); 

Process process = builder.start(); 

process.waitFor(); 
+0

這似乎不適用於VS 10.0 – 2015-08-11 13:46:05

+0

@Jordfräs肯定不會!至少,對於VS 10,路徑是完全不正確的。不知道編譯器命令本身,但我相信它保持不變。 – shybovycha 2015-08-11 21:32:39

+0

我的意思是即使改變路徑。我認爲你必須運行vcvarsall.bat腳本(或者詳細檢查它設置的內容,我沒有時間)。 – 2015-08-12 05:07:11

1

如果只是在PATH中,您可以運行cl.exe。這不是一個Java問題。這是你的操作系統的配置。

問題是,您可能無法配置您運行應用程序的每臺機器的環境。而其他可能的問題是,編譯器可能必須在特定的目錄中執行(例如在項目目錄中)。

很顯然,路徑中的空間增加了另一層級的複雜性。

首先嚐試從命令提示符完全相同。它有可能會失敗,並會打印原因。

如果有效返回到您的java代碼,但嘗試讀取cl.exe的STOUT和STDERR。我相信它會打印出一些可以幫助你理解問題的東西。

+0

不,cl.exe時添加和/或它的父目錄什麼也沒做。輸出:27870395166881.cpp27870395166881.cpp(1):致命錯誤C1034:stdio.h:不包括路徑集 錯誤:Microsoft(R)32位C/C++優化編譯器版本15.00.30729.01(80x86版權所有)(C)Microsoft Corporation。保留所有權利。' – shybovycha 2011-12-18 17:48:23