我最近一直在开发一个程序,该程序可以从Java程序编译并运行C ++程序,我已经使一切基本正常(或至少据我所知),但是后来我注意到有些东西被打印到错误流中:
cdog5000@srv3:~$ java -Xmx50m -jar main2.jar
Running Command: sudo g++ --static -o "/home/cdog5000/cody.out" "/home/cdog5000/cody.cpp"
Err: g++: "/home/cdog5000/cody.cpp": No such file or directory
Err: g++: no input files
cdog5000@srv3:~$ ls -l
total 4548
-rwxr-xr-x 1 cdog5000 cdog5000 1297588 Feb 3 23:11 a.out
-rwxr-xr-x 1 cdog5000 cdog5000 7978 Feb 2 04:39 cody
-rw-r--r-- 1 cdog5000 cdog5000 106 Feb 4 02:09 cody.cpp
-rwxr-xr-x 1 cdog5000 cdog5000 1297357 Feb 4 02:09 cody.out
-rw-r--r-- 1 root root 410433 Feb 4 02:48 log.txt
-rwxr-xr-x 1 cdog5000 cdog5000 801088 Feb 1 05:24 main.jar
-rw-r--r-- 1 cdog5000 cdog5000 804802 Feb 4 02:49 main2.jar
drwxr-xr-x 3 cdog5000 cdog5000 4096 Feb 3 23:11 sandbox
cdog5000@srv3:~$ sudo g++ --static -o "/home/cdog5000/cody.out" "/home/cdog5000/cody.cpp"
如您所见,如果我通过SSH而不是Java代码进行操作,它会起作用吗?
Java代码:
public static Exec exec(String cmd){
Exec exec = new Exec(cmd);
try {
long current = System.currentTimeMillis();
Process proc = Runtime.getRuntime().exec(cmd);
exec.setReturnValue(proc.waitFor());
exec.setRunTime(System.currentTimeMillis() - current);
BufferedInputStream bos = new BufferedInputStream(proc.getInputStream());
byte b[] = new byte[1024];
String content = "";
while(bos.read(b) != -1) {
content += new String(b);
}
exec.setStdIn(content.split("\n"));
content = "";
bos = new BufferedInputStream(proc.getErrorStream());
while(bos.read(b) != -1) {
content += new String(b);
}
exec.setStdErr(content.split("\n"));
} catch (Exception e) {
e.printStackTrace();
}
return exec;
}
感谢您的任何帮助,它已得到批准!
Err: g++: "/home/cdog5000/cody.cpp": No such file or directory
告诉你问题所在。
您的一级引号过多,因此您正在寻找"/home/cdog5000/cody.cpp"
而不是/home/cdog5000/cody.cpp
。
该的Runtime.exec文档说:
更精确地讲,使用字符串StringTokenizer将命令字符串分解为令牌,该StringTokenizer由调用new
StringTokenizer(command)创建,而无需进一步修改字符类别。然后以相同的顺序将令牌生成器生成的令牌放置在新的字符串数组cmdarray中。
意味着它仅在空格上分割,而不像shell那样处理双引号。
许多语言都有两种功能,一种称为exec
逐字运行命令,另一种system
将字符串传递给外壳,外壳将在其中拆分单词并扩展通配符。
我看不到system
Java中的通话,因此我认为您必须使用exec(String[] cmdarray)
而不是exec(String command)
。
我在Ubuntu 18.04上,g -8编译器找不到libboost-asio模块。然而,我用 每当我试图用下面的头文件进行编译时 我被抛出一个编译器错误,说头文件无法找到。 我能够使用其他boost头进行编译,例如boost/array。hpp,但与asio无关。 在libbooost上运行版本检查 returns:版本:1.65.1.0ubuntu1 我也找不到任何asio使用倾向的痕迹。我怀
在spring Java框架中,我使用context.xml文件创建bean,然后用加载它。 我的程序抛出异常。 文件存在。我使用Gradle进行依赖关系管理,并且我的src文件夹(文件所在的位置)在intellij中标记为resource。我知道由于某种原因,即使我的src文件夹应该包含在classpath变量中,但gradle run任务只是不能从这里抓取它。 当我使用时,所有的工作都很好,但
PhpStorm 2021.1.1 Mac M1 11.3 当我尝试使用或查找文件时,PhpStorm未能找到该文件。似乎正在尝试从目录,而不是在项目目录中搜索。 我试图< code >文件|无效缓存,运气不好。有人能帮忙吗?
问题内容: 我在当前工作目录上有文件,但是javac报告: 我正在研究ubuntu。 问题答案: 从上面的评论看来,您尝试过: 在您的Ubuntu系统上。该分离器是在UNIX系统上的Windows。 Ubuntu考虑了直到的命令,因此给出了消息。 应该编译好。
问题内容: 我决定开始一个新问题,以便可以严格关注FileReader错误。 此方法采用文件名和新文件的所需输出名。假设输入的文件名是“ hello.txt” …该方法使其类似于“ /home/User/hello.txt”,它作为参数进入FileReader。问题是,即使该文件确实存在并且目录结构和权限正确,我仍将其作为输出“ /home/User/hello.txt(无此类文件或目录)”获得。