質問

CreateProcessを使用してclを呼び出して、別のC ++プログラム(TestProg.cxx)をDLLにコンパイルしてリンクします。次のコンパイルオプションを使用してcl.exeを呼び出します。

コンパイルオプション:

/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
.

呼び出し:

if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
                   FALSE,0,NULL,NULL,&si,&pi) ) 
{
    //....
}
.

TestProg.exe#include <iostream.h>が含まれている場合、次のコンパイルエラーが発生しました:

TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set
.

#includeコマンドなしで、次のリンケージエラーが発生しました:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
.

私は何をしていますか?

Web上で最後の6-7時間の答えを検索しましたが、見つかりませんでした。Windows APIを使用することは私にとって新しいです。

役に立ちましたか?

解決

CreateProcessの定義を見れば:

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
.

__in_opt LPVOID lpEnvironment,にオプションのパラメータNULLを設定しています。

上記の定義によると:

新しいプロセスの環境ブロックへのポインタ。このパラメータがNULLの場合、新しいプロセスは呼び出しプロセスの環境を使用します。

cl.exeは、環境変数からのロケーション情報とライブラリ検索パスを含みます - VSディレクトリのsetenv.batを参照してください。この場合、これらの変数が設定されている環境であなたの呼び出しプロセスまたはターゲットプロセスも実行されていません。

選択肢があります - MSDNに従って環境変数を作成できます。

環境ブロックは、ヌル終端ブロックで構成されています。 ヌル終端文字列。各文字列は次の形式です。

name=value\0
.

等号は区切り文字として使用されているため、使用しないでください。 環境変数の名前

またはプログラムをVS Toolsプロンプトから実行する必要があります。良いチェックこれは、実際には問題がこのプロンプトからプログラムを実行することです。

#includeを使用しない理由はリンカエラーを生成することは、含まれていない場合、cl.exeがそれらを探すことはできません - それはC / C ++ランタイムlibsを探します。

サイドとして注 - C ++の標準は#include <iostream>なしで.h i.eになると考えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top