作成した実行形式ファイルを他のPCで実行できない

[戻る]
ぽーる 2006/06/10(土) 17:12:39
はじめまして、ぽーるといいます。

Visual Studio 2005 でビルドしたC言語プログラムを、VC++のインストールされていな
いPCで実行しようとすると、「このアプリケーションの構成が正しくないため、アプ
リケーションを開始できませんでした。アプリケーションを再度インストールすること
により問題が解決する場合があります。」と出て実行できません。

プログラムにはMFCやWin32APIなどは使っておらず、C言語の標準関数のみで作りまし
た。

また、VC++のコンパイラを使い、コマンドラインでコンパイルしてみたところ他のPC
でも実行できました。
このとき、IDEからビルドしたときのファイルサイズは19KBだったのに対し、コマン
ドラインでコンパイルしたファイルのサイズは79KBでした。

どのようにしたら、IDEからでも他のPCでも実行できるような実行形式ファイルを出力
できるようになるのでしょうか?
よろしくお願いします。

シャノン 2006/06/10(土) 18:58:04
> プログラムにはMFCやWin32APIなどは使っておらず、
> C言語の標準関数のみで作りました。

標準関数を使うためには、C ランタイムライブラリ(CRT)というライブラリとリンクす
る必要があります。
VC++ 2005 用の CRT は、VC++ 2005 がインストールされていない環境には入っていない
可能性があります。

> また、VC++のコンパイラを使い、コマンドラインでコンパイルしてみたところ
> 他のPCでも実行できました。
> このとき、IDEからビルドしたときのファイルサイズは19KBだったのに対し、
> コマンドラインでコンパイルしたファイルのサイズは79KBでした。

CRT は、ダイナミックリンクとスタティックリンクという2つのリンク方式から選ぶこ
とが出来ます。
スタティックリンクにすると、EXE の中に CRT が含まれます。そのため、EXE のファイ
ルサイズが大きくなりますが、別途 CRT を用意する必要がなくなります。
ダイナミックリンクでは、CRT は DLL 形式で提供されます。EXE と CRT が別のファイ
ルになるため、EXE のサイズは小さくなりますが、CRT DLL がインストールされていな
いマシンでは動きません。

VC++ 2005 は、IDE からビルドすると、標準でダイナミックリンクが選択されます。コ
マンドラインからビルドすると、おそらく規定値がスタティックリンクなのでしょう。

というわけで、お手軽な方法としては、プロジェクトのプロパティを開き、「構成プロ
パティ」→「C/C++」→「コード生成」のページにある「ランタイムライブラリ」の項目
を、「DLL」を含まないものにすれば、スタティックリンクにすることができます。
対象のマシンに CRT DLL をインストールしておけば、EXE のサイズが小さくなるので便
利ですが、VC++ 2005 のランタイムライブラリはナントカアセンブリという形式になっ
ているらしく、単にファイルをコピーするだけでいいのかどうか自信がありません。
そのへん、詳しい方がいらっしゃいましたら、フォローお願いします。

瀬戸っぷ [E-Mail] 2006/06/10(土) 23:52:04
とりあえず、
http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=ja
でダウンロード可能なようです。
VS2005のCD-ROMの中や、インストールした先にも入っているようですが。

ねこまんじゅう 2006/06/11(日) 00:32:44
VC2005でプロジェクトを開いたら、
ツール → xxxのプロパティ をクリックして、プロパティ画面を開きます。

次に、構成プロパティ → C/C++ → コード生成 の順にクリック。

「ランタイムライブラリ」のところを【マルチスレッド MT】にしてOKをクリック。

あとはいつもどおりビルドすればいいと思われます。

ぽーる 2006/06/11(日) 10:55:08
[[解決]]
シャノンさん、瀬戸っぷさん、ねこまんじゅうさん、回答ありがとうございました。

ランタイムライブラリのところをマルチスレッドMTに変えてみたところ、他のPCで
も動作する実行形式ファイルを作成することができました。

それにしても、標準関数にまでこのようなランタイムライブラリが使用されているとい
うのは、知りませんでした。

古いスレッドには追加発言できません。