从Java代码运行MSVC编译器会出错

时间:2011-12-18 16:38:14

标签: java windows visual-studio-2008 visual-c++ compilation

我正在尝试使用Java代码中的 MSVC2008 编译器编译一些C ++源文件。例如。我有一个源文件的路径和ms编译器的路径。我需要运行编译器并获取可执行文件路径或错误状态。但到目前为止我得到的是“没有包含路径定义”错误和2的退出状态。

谷歌搜索给了我vsvars32.bat文件路径,它修复了从原始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并获取我的可执行文件?

2 个答案:

答案 0 :(得分:1)

如果它只在你的PATH中,你可以运行cl.exe。这不是一个java问题。它是您操作系统的配置。

问题是,您可能无法配置运行应用程序的每台计算机的环境。其他可能的问题是编译器可能必须在特定目录中执行(例如在项目目录中)。

显然,路径中的空格增加了另一层次的复杂性。

首先尝试从命令提示符处完全相同。它也有可能失败并打印原因。

如果有效则返回到您的java代码,但尝试读取cl.exe的STOUT和STDERR。我相信它打印的东西可以帮助你理解问题所在。

答案 1 :(得分:0)

诀窍是为INCLUDE及其LIB设置ProcessBuilderProcess个环境变量:

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();