はじめまして、ludといいます。
Visual Studio 2005 C++で作成したOpenGLプログラムをVisual Studio 2005をインストー
ルしていないPCで動かしたいのですができません。OSはXP Home Edition SP2です。
プログラムはglut-3.7.6-binとSDL-devel-1.2.13-VC6のincludeファイルとlibファイルを
使用して作成しています
現在試している方法は、プロパティのコード生成のランタイムライブラリをマルチスレッ
ド(/MT)にしてビルドしようとしているのですが以下のようなエラーなどが出てビルドで
きません。
msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit は既に LIBCMT.lib(crt0dat.obj) で
定義されています。
どのようにすれば、他のPCでも動かすことができるようになるでしょうか?
すいませんが、よろしくお願いします。
また、質問で説明不足な点がございましたら、それも補足させていただきます。
他のマシンでは何というエラーメッセージが出ますか?
# 原因に心当たりはついているんだけど、敢えて最初はこの質問。
# 次からは最初にエラーメッセージを書いてもらえると、この一手間が省けます。
>他のマシンでは何というエラーメッセージが出ますか?
アプリケーションの構成が正しくないというエラーがでます。
>次からは最初にエラーメッセージを書いてもらえると、この一手間が省けます。
ご指摘ありがとうございます。次からは気をつけます。
開発に利用しているマシンにインストールされている VisualStudio は、2005 と 2005
SP1 のどちらですか?
2005 であれば、これ
http://www.microsoft.com/downloads/details.aspx?familyid=32BC1BEE-A3F9-4C13-
9C99-220B62A191EE&displaylang=ja
2005 SP1 であれば、これ
http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-
984D-389C36F85647&displaylang=ja
を、動かすマシンにあらかじめインストールしておく必要があります。
ちょっと補足。
VisualStudio2005の開発したVC++のアプリの場合、
必要なランタイムライブラリがPCに最初から入っているケースは
VisualStudio2005が出た後に出来たOSだけだと思います。
また、SP1であれば、SP1が出る以前のOSには入っていないでしょう。
この為、シャノンさんが書かれているようにランタイムライブラリを
インストールしておく必要があります。
また、VisualStudio2005ではDLLヘルの問題を回避する為に
サイド・バイ・サイドという方式を採用していて
単にDLLを入れとけば良いと言う状態ではなくなっています。
この場合、MSが用意したインストールパッケージを使用する
必要があります。
シャノンさん、PATIOさんありがとうございます。
>シャノンさん・PATIOさん
動かすPCにあらかじめインストールしておけば、デバッグの方式にかかわらず
動かすことができるのですか?
開発しているPCにインストールしておくものはなにかあるのでしょうか?
デバッグの方式とは何ですか?
原則、開発マシン以外に配布するものはリリースビルドすべきです。
> 開発しているPCにインストールしておくものはなにかあるのでしょうか?
ありません。
VC++ ランタイムは VisualStudio と一緒にインストールされています。
まず、デバッグのプログラムは基本的に配布できません。
何故かと言うとデバッグ版のランタイムが配布を禁止されているからです。
基本的に開発機であれば、開発環境もインストールしているはずなので
一般的には問題になりません。
他の開発環境で無いPCで動かすのであれば、リリース版のライブラリを
使った物にする必要があります。
> 現在試している方法は、プロパティのコード生成のランタイムライブラリをマルチスレッ
> ド(/MT)にしてビルドしようとしているのですが以下のようなエラーなどが出てビルドで
> きません。
> msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit は既に LIBCMT.lib(crt0dat.obj) で
> 定義されています。
この部分が意味がわかりません。
他のPCで動かしたいからこのような設定にしているのでしょうか?
やりたい事に対してやっている事が見当はずれな気がします。
もし別の質問なのであれば、スレッドを分けて別に挙げた方がいいです。
シャノンさん、PATIOさんありがとうございます。
>PATIOさん
>この部分が意味がわかりません。
>他のPCで動かしたいからこのような設定にしているのでしょうか?
>やりたい事に対してやっている事が見当はずれな気がします。
コード生成のランタイムライブラリをマルチスレッド(/MT)しデバックすれば、開発環境
のないPCでの実行が可能になる話を聞いたので試したら最初に明記されているエラーがで
ました。これは間違いなのでしょうか?
>シャノンさん
>デバッグの方式とは何ですか?
>原則、開発マシン以外に配布するものはリリースビルドすべきです。
デバッグの方式という言葉は間違っていました。すいません。
ランタイムライブラリの設定のことです。
開発マシン以外に配布し実行したいのですがその、リリースビルドがわかりません。
ただVC++でReleaseを選択しビルドするだけではできないので方法を教えてください。
基礎的なことばかりで申し訳ありません。
> コード生成のランタイムライブラリをマルチスレッド(/MT)しデバックすれば、
『プロジェクトのプロパティ [構成プロパティ]-[全般]の[MFCの使用]を[共有DLLでMFCを
使う]を[スタティックライブラリでMFCを使用]に変更して、ビルドすれば、』
の間違いじゃないの?
確かにReleaseでこれを変更すると[コード生成]の[ランタイムライブラリ]が[マルチスレ
ッド(/MT)]に変わるけど。
> デバッグの方式という言葉は間違っていました。すいません。
間違っていたというより、デバッグという単語の意味わかってないんじゃないの?
> ただVC++でReleaseを選択しビルドするだけではできないので方法を教えてください。
上記の[MFCの使用]を[スタティックライブラリでMFCを使用]に変更してためしてください。
または[ランタイムライブラリ]を[マルチスレッド(/MT)]から[マルチスレッドDLL(/MD)]
に戻して、ビルドする。この場合、シャノンさんがあげているMFC再配布ファイルをイン
ストール先PCにインストールする。
MFC を使ってるとは書いてないですねぇ。
もし使ってるなら、次からは最初に書いてくださいね。
で、そもそも、どうして VC++ 2005 なのに
> SDL-devel-1.2.13-VC6
なんですか?
SDL-devel-1.2.13-VC8 ってのもあるじゃん。
ただ、GLUT の方は VC++ 6.0 でコンパイルされているみたいですね。
基本、スタティックリンクにしたいなら、すべてのライブラリが使う CRT を統一しなけ
ればなりません。
> msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit は既に LIBCMT.lib(crt0dat.obj)
で定義されています。
というエラーの原因は、GLUT か SDL が VC++ 6.0 の CRT をリンクしていて、今回作っ
ているプログラムが VC++ 2005 の CRT をリンクしているためじゃないですかね。
それぞれのライブラリの DLL 版を使うか、ライブラリをソースコードから VC++ 2005 で
ビルドしなおすのが確実です。
maruさんありがとうございます。
>上記の[MFCの使用]を[スタティックライブラリでMFCを使用]に変更してためしてください。
>または[ランタイムライブラリ]を[マルチスレッド(/MT)]から[マルチスレッドDLL(/MD)]
>に戻して、ビルドする。この場合、シャノンさんがあげているMFC再配布ファイルをイン
>ストール先PCにインストールする。
上記の方法でビルドできました。開発環境のないPCでの実行には、再配布ファイルをイン
ストールしなければ実行できないということでしょうか?
失礼しました。
> MFC を使ってるとは書いてないですねぇ。
確かに...
ランタイムDLLの再配布ファイルを紹介しているようだったので、つい確認せず...
> プログラムはglut-3.7.6-binとSDL-devel-1.2.13-VC6のincludeファイルとlibファイルを
> 使用して作成しています
と書いてあるので、MFCではなくそれらのDLLが無いのかな、とも思ったんですけどね。
> それぞれのライブラリの DLL 版を使うか、ライブラリをソースコードから VC++ 2005 で
> ビルドしなおすのが確実です。
ということでしょうね。
ありがとうございます。
開発環境のないPCで、VC++で作成したプログラムを動かすことは
そのPCになにもインストールしない状態ではできないのでしょうか?
答えは書いたつもりですが、読まれましたか?
呼んだけど意味がわからないところがあったのなら、そう言ってください。