g ++:找不到文件

时间:2011-02-03 23:55:51

标签: java linux g++

我最近一直在开发一个程序,从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;
    }

感谢您的帮助,感激不尽!

2 个答案:

答案 0 :(得分:2)

Err: g++: "/home/cdog5000/cody.cpp": No such file or directory

告诉你问题。

您的报价水平过高,因此您需要"/home/cdog5000/cody.cpp"而不是/home/cdog5000/cody.cpp

Runtime.exec documentation说:

  

更准确地说,命令字符串使用由调用new StringTokenizer(命令)创建的StringTokenizer分解为标记,而不进一步修改字符类别。然后,由tokenizer生成的标记以相同的顺序放置在新的字符串数组cmdarray中。

这意味着它只在空格上分裂,它不像shell那样处理双引号。

许多语言都有两个函数,一个名为exec,它运行命令逐字,而system将字符串传递给shell,它将分割单词并展开通配符。

我无法在Java中看到system调用,因此我认为您必须使用exec(String[] cmdarray)而不是exec(String command)

答案 1 :(得分:0)

海湾合作委员会并不是这样说的 - 看起来文件不在那里。你确定你向我们展示了正确目录的输出吗?