我正在尝试使用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
并获取我的可执行文件?
答案 0 :(得分:1)
如果它只在你的PATH中,你可以运行cl.exe
。这不是一个java问题。它是您操作系统的配置。
问题是,您可能无法配置运行应用程序的每台计算机的环境。其他可能的问题是编译器可能必须在特定目录中执行(例如在项目目录中)。
显然,路径中的空格增加了另一层次的复杂性。
首先尝试从命令提示符处完全相同。它也有可能失败并打印原因。
如果有效则返回到您的java代码,但尝试读取cl.exe
的STOUT和STDERR。我相信它打印的东西可以帮助你理解问题所在。
答案 1 :(得分:0)
诀窍是为INCLUDE
及其LIB
设置ProcessBuilder
和Process
个环境变量:
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();