2012-04-14 12 views
0

これに類似した質問があるかもしれないことは知っていますが、C + +であり、同じかどうかわかりません。私はいくつかのコードを持っていますC関数が順番に実行されていない

void BuildApp(char *AppName) 
{ 
     char *cmd; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/"); 
     // Make the package dir. 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/DEBIAN"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/Applications"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/Applications/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, ".app"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/Applications/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, ".app/Inc"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("cp ./Projects/", AppName); 
     cmd = combine(cmd, "/Assets/app.icon.png ./Projects/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, "/Package/Applications/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, ".app/Icon.png"); 
     system(cmd); 
     printf("Building application..."); 
     cmd = ""; 
     cmd = combine("cd ./Projects/", AppName); 
     system(cmd); 
     printf(cmd); 
     cmd = ""; 
     cmd = combine("gcc App.c -o ", AppName); 
     printf(cmd);system(cmd); 
     system(cmd); 
} 

しかし、それは順不同で実行されているようです。これはLinux(実際にはcygwin)上で実行され、GCCでコンパイルされています。

gcc: App.c: No such file or directory 
gcc: no input files 
Building application... 
cd ./Projects/Sample 

しかし、私は彼らがどこに順序を確認するために、印刷cd声明(後:何らかの理由で、GCCを実行する必要がありますsystem();機能は、アクションが私にこの出力を与え、cdコマンドの前に実行されているコンパイルGCCのコンパイルコマンドが実行されていないため、コンパイルされていないApp.cが残っています。 これがなぜ起こっているかについての助けに感謝します。

+0

完全なソースコード(または問題を再現するのに十分なもの)を投稿できますか? – Edmund

+0

なぜシステム()のシステムコールでセミコロンを使用しないのですか? "mkdir .../...; cd ...; gcc ..."のように。 –

+0

私の主なアプリケーションファイルでは、コマンドライン引数があることを確認して、 'BuildApp(); 'argv [1]'をcharパラメータとして使用します。以下は 'combine();'関数コードです: 'char buffer [100]; char * combine(char * str1、char * str2) { sprintf(バッファ、 "%s%s"、str1、str2); リターンバッファ。 } ' – Matthew

答えて

7

次の2つの "問題" を持っている:

  • あなたが見ている出力は両方stderr(GCCエラーメッセージ)とstdout(それの残りの部分)からです。これらのメッセージが端末に表示される順序は、それらを生成したコードが実行した順序と同じであると推測しています。あなたはそれに頼ることはできません。 stdoutは通常バッファリングされますが、stderrは一般的には表示されないため、画面上に表示される順序はコードの実行順序を示す指標ではありません。
  • system("cd whatever");コールはバグです。それは新しいシェルを生成し、そのシェルはディレクトリを変更し、すぐに存在します。親プロセスまたはそれ以降の呼び出しで副作用が発生しません。親プロセスでchdirを使用するか、同じsystem呼び出しでcdgccを実行する必要があります。
2

systemコマンドは、別個のプロセスとして実行されます。あなたは新プロセスの作業を変更します。それはただ終了します。次の実行プロセスには影響しません。

使用system("cd dir; command");

関連する問題