2017-01-21 5 views
1

C++コードを生成してコンパイルして実行するプログラムを作成する必要があるため、コード生成部分を終了してGeneratedCode.cppというファイルに書き込んでいます。今私はコンパイル部分に立ち往生している、私は書いた:VC++を使用して生成されたC++コードをコンパイル

system(R"(call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat")"); 
system(R"(call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat")"); 
system("cl GeneratedCode.cpp"); 

まずこれは正しい方法ですか?この件に関する情報は、特にVC++の場合は非常に稀です。そうであれば、IDEを使用しているかどうかに問題があります。

IDEを使用しているとき、「GeneratedCode.cpp(2):致命的なエラーC1034:iostream:パスが含まれていません」というメッセージが表示されます。もちろん私はiostreamヘッダーを使用しています。

exeを直接実行すると、「 'cl'は内部または外部コマンド、実行可能プログラムまたはバッチファイルとして認識されません」というメッセージが表示されます。私はvcvarsall.batとvcvars32.batを呼び出しましたが。

+1

バッチスクリプトで設定された環境は、 'system'によって作成されたコマンドシェルがexitを呼び出すと失われます(' call'はこのコンテキストではno-opです)。 '&& 'を使って、単一のシステムコール内で複数のコマンドを連鎖させたり、プロセス全体のバッチスクリプトを書いて呼び出すことができます。 – doynax

+0

@doynaxどうもありがとうございました。私は今、物事を評価することを願っています。 – Kaaf

+0

誰かがC++コードを生成し、dllにコンパイルして実行するプログラムの完全なコードに興味があるなら、ここで見つけることができます:http://www.cplusplus.com/forum/beginner/206145/#msg977248 – Kaaf

答えて

1

systemまたは_wsystemへの各呼び出しは、呼び出しが終了すると失われる新しい環境を作成します。プログラムでVisual C++コマンドプロンプトのLIBINCLUDEなどのように環境変数を設定する必要がある場合は、systemを複数回呼び出すことで成功することはありません。すべて一緒に

  1. 避けsystem:ここ

    は、私はそれらを推薦するようにするために、あなたのオプションです。 cl.exeが文字列連結関数(here)で正しく動作するために必要な環境ブロックを設定し、その環境でCreateProcessを呼び出します。
  2. cl.exeが正常に動作するための前提条件コマンドをすべて含むバッチファイルを作成し、systemを呼び出してからバッチファイルを削除してください。
  3. コマンドを&&と連鎖させ、大きなコマンド文字列を使用してsystemを1回呼び出します。
+1

詳細な回答ありがとうございます。 – Kaaf

関連する問題