2011-02-03 27 views
2

最近私は、JavaプログラムからC++プログラムをコンパイルして実行するプログラムを開発していますが、基本的に(あるいは私の知る限りで)すべてを手に入れました。エラーストリーム:g ++:ファイルが見つかりません

[email protected]:~$ 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 


[email protected]:~$ 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 
[email protected]:~$ 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; 
    } 

おかげで、それがapprectiatedされます!

+2

g ++はちょうど '' /home/cdog5000/cody.out ''という名前のファイルを探しているかもしれません。引用符を削除してみてください... – CanSpice

+0

驚くべき、それはそれを修正した。返信として投稿し、私はあなたに受け入れられた回答を与えます。 – cdog5000

+0

ああ、私は受け入れられた答えに逃した。しかたがない。 C'est la vie。 – CanSpice

答えて

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

あなたに問題があります。

引用レベルが1レベル過ぎるので、ではなく"/home/cdog5000/cody.cpp"を探しています。

Runtime.exec documentationは言う:

はより正確には、コマンド文字列は、文字カテゴリのさらなる修正を呼び出し新しいStringTokenizerは(コマンド)で作成したStringTokenizerを使ってトークンに分割されます。トークナイザによって生成されたトークンは、新しい文字列配列cmdarrayに同じ順序で配置されます。

意味は、それは空白で分割されるだけで、シェルのように二重引用符は処理されません。

多くの言語には、そのままコマンドを実行するexecとシェルに文字列を渡すsystemという2つの機能があり、ワードを分割してワイルドカードを展開します。

Javaでsystemコールが表示されないので、exec(String command)ではなくexec(String[] cmdarray)を使用する必要があります。

+0

Btw、execを使用するJava 5+の方法は、ProcessBuilderを使用することです。 – sjr

0

GCCはそのようにはありません。ファイルが存在しないようです。あなたは正しいディレクトリからの出力を見せているでしょうか?

+0

cdog5000 @ srv3:〜$ ls -l "/home/cdog5000/cody.cpp" -rw-r - r-- 1 cdog5000 cdog5000 106 Feb 4 02:09 /home/cdog5000/cody.cpp – cdog5000

+0

cdog5000 @ srv3の実行:〜$ sudo g ++ - 静的-o "/home/cdog5000/cody.out" "/home/cdog5000/cody.cpp"出力 – blueberryfields

+0

何も、問題は修正されました。 – cdog5000

関連する問題