OpenGLプログラムの他のPCでの実行ができない – 固定ページ 2 – プログラミング – Home

OpenGLプログラムの他のPCでの実...
 
通知
すべてクリア

[解決済] OpenGLプログラムの他のPCでの実行ができない

固定ページ 2 / 3

lud
 lud
(@lud)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

シャノンさんすいません。飛ばしていて気づきませんでした。

>それぞれのライブラリの DLL 版を使うか、ライブラリをソースコードから VC++ 2005 で
>ビルドしなおすのが確実です。

この部分の意味がわからないので、方法がわかりません。
すいませんが、教えて下さい。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

VC++ 2005 SP1 はインストールしていますか?
もしまだなら、インストールしてください。
http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2005/sp1/
インストールにはすごく時間がかかるので、余裕があるときに。

で、スタティックリンクしていると思っていたのですが、GLUTもSDLもDLLで提供されてい
るのを使っていますか?
であれば、SDLをSDL-devel-1.2.13-VC8.zipを使うように変更してみてください。

案外これだけで問題解決したりして。


返信引用
lud
 lud
(@lud)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

>VC++ 2005 SP1 はインストールしていますか?
シャノンさん、ありがとうございます。
インストールを現在行っていてSDLも変更して試してみます。

>で、スタティックリンクしていると思っていたのですが、GLUTもSDLもDLLで提供されてい
>るのを使っていますか?

いろいろ基礎的なことばかりで申し訳ないんですけど、これはどういうことですか?
*.libなでではなく、*.dllのファイルを使うということですか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

一旦、状況を整理しなおさせてください。

> glut-3.7.6-binとSDL-devel-1.2.13-VC6のincludeファイルとlibファイルを
> 使用して作成しています

とおっしゃっていますが、glut-3.7.6-bin とは、ここ
http://www.xmission.com/~nate/glut.html
の「glut-3.7.6-bin.zip (117 KB)」で、SDL-devel-1.2.13-VC6 とは、ここ
http://www.libsdl.org/download-1.2.php
の「SDL-devel-1.2.13-VC6.zip (Visual C++ 6.0)」で間違いありませんか?

どちらの zip ファイルも、展開すると dll が出てきますが、これは使っていないのです
か?
使っているかどうかわからなければ、dll を他の名前にリネームしてもプログラムが動く
かどうか確かめてください。
より確実な方法としては、Dependency Walker
http://www.dependencywalker.com/
を使って exe を開いてみて、左側のツリーに dll があるかどうか調べることができま
す。

まずはここまで。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

配布を考えるのであれば、基本的に自分がどんなライブラリを
どんな形で使用しているのかをきちんと把握しておく必要があります。
そして、使っているライブラリがDLLの場合、動作するにはそのDLLが
必要になりますからPCにはそのDLLファイルがインストールされている
必要があります。それらのDLLの内、配布先のOSにさいしょから入って
いるDLL以外は基本的に追加でインストールしないとDLL自体が存在し
ませんから動かないはずです。そういう意味では配布先のOSの種類や
サービスパックの当たり具合で入っているDLLの中身は変わりますから
確実に動かす為には必要なDLLを全てインストールできるように
インストールパッケージを提供する必要が有ります。

これが、スタティックリンクライブラリであれば、実行ファイルに
組み込まれた状態になっていますから別に配布する必要は無いわけです。
但し、スタティックリンクライブラリの場合、実行ファイルのサイズは
かなり大きくなります。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

この辺の話は、VC++2005だから違うと言うような話では有りません。
他の開発環境を使っていても同じ事です。

但し、VC++2005移行はサイド・バイ・サイドと言うDLLの管理方法を
使うようになった為、以前のように単純にDLLを同梱しているだけでは
うまく動かないようになっています。
実行ファイルと同じフォルダにあるDLLを使う場合はそれなりの設定が
必要になっています。逆に特に指定し無いのであれば、サイド・バイ・
サイドの管理下のDLLは専用のインストーラーでインストールする必要が
あると言う部分が今までと違っています。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> 但し、VC++2005移行はサイド・バイ・サイドと言うDLLの管理方法を
> 使うようになった為、以前のように単純にDLLを同梱しているだけでは
> うまく動かないようになっています。
> 実行ファイルと同じフォルダにあるDLLを使う場合はそれなりの設定が
> 必要になっています。逆に特に指定し無いのであれば、サイド・バイ・
> サイドの管理下のDLLは専用のインストーラーでインストールする必要が
> あると言う部分が今までと違っています。

そんなことはありません。
2005 以降の VC++ ランタイムはそうなっていますが、すべての DLL がそうとは限りませ
ん。
単純に同じフォルダに放り込んでもうまくいく DLL もあります。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

一応、「サイド・バイ・サイドの管理下のDLLは」と
書いているのが、全てがそういうわけでは無いと言う
意味で書いたつもりだったんですが、
わかりにくかったですかねぇ。


返信引用
lud
 lud
(@lud)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

遅くなってしまってすいません。

>とおっしゃっていますが、glut-3.7.6-bin とは、ここ
>の「glut-3.7.6-bin.zip (117 KB)」で、SDL-devel-1.2.13-VC6 とは、ここ
>の「SDL-devel-1.2.13-VC6.zip (Visual C++ 6.0)」で間違いありませんか?

はい、そこからダウンロードし使用しています。現在はSP1をインストールしSDL-devel-
1.2.13-VC8を使用しています。

>より確実な方法としては、Dependency Walkerを使って exe を開いてみて、左側のツ
リーに >dll があるかどうか調べることができます。

確認してみたところ、ランタイムライブラリをマルチスレッドDLL(/MD)でビルドして作成
した実行ファイルでは大きな枝でKERNEL32.DLL、OPENGL32.DLL、GLU32.DLL、SDL.DLL、
MSBCR80.DLLの4つが存在していました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> わかりにくかったですかねぇ。

うにゅ、すいません。
SDL とかのサードパーティ DLL も面倒なインストールが必要と読んでしまいました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> 確認してみたところ、ランタイムライブラリをマルチスレッドDLL(/MD)でビルドして
> 作成した実行ファイルでは大きな枝でKERNEL32.DLL、OPENGL32.DLL、GLU32.DLL、
> SDL.DLL、MSBCR80.DLLの4つが存在していました。

たぶん最後のは MSVCR80.DLL の間違いだと思いますが。
KERNEL32.DLL と OPENGL32.DLL は Windows が最初から持っているシステム DLL です。
これらはインストール先の環境に最初からあるはずです。
GLU32.DLL と SDL.DLL は今回使用したライブラリです。
これはインストール先に配布しなければなりません(ライセンス要確認)。おそらく、
exe と同じフォルダにおいておけば動くでしょう。
MSVCR80.DLL が VC++ のランタイムライブラリです。
これは前述(2008/04/22(火) 13:14:39)のインストーラを使って、あらかじめインスト
ール先にインストールしておく必要があります。

で、最後の MSVCR80.DLL を、別途インストールさせること無く済ませたいという場合
は、ランタイムライブラリを「マルチスレッド(/MT)」にすれば(exe ファイルのサイ
ズはかなり大きくなるでしょうが)可能だと思います。

> *.libなでではなく、*.dllのファイルを使うということですか?

DLL の使い方には2通りあります。
1つは、LoadLibrary を使う方法。この場合、DLL だけあればいいです。が、面倒です。
もう1つは、インポートライブラリを使う方法。これは楽ですが、*.dll と *.lib が両
方必要です。

紛らわしいのですが、*.lib はインポートライブラリとスタティックライブラリの2種類
があります。
インポートライブラリは DLL と併用するためのもので、コードの実体は DLL にありま
す。
スタティックライブラリは LIB だけで使えて、コードの実体も LIB の中にあります。
スタティックライブラリを使うと、DLL が要りません。が、EXE のサイズが増大します。

Unix 由来のライブラリには、DLL と LIB の両形態で提供しているものが多いと思いま
す。
もし今回、DLL を使うのを嫌って LIB(スタティックライブラリ)を使おうとしているな
ら…という想定の元でやりとりしてきたわけですが、SDL も GLUT も DLL と LIB(イン
ポートライブラリ)を使っているということが判明しました。

で、改めてお聞きしますが、ランタイムライブラリを /MT にした場合、今でも

> msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit は既に LIBCMT.lib(crt0dat.obj)
> で定義されています。

というエラーが出ますか?

もし出る場合、VC++ で新しいプロジェクトを作って、コードには空っぽの main 関数だ
け書いて、ランタイムライブラリを /MT にして、
・SDL だけリンクした場合
・GLUT だけリンクした場合
でもエラーが出るかどうか教えてください。


返信引用
lud
 lud
(@lud)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

ありがとうございます。試してみます。

>たぶん最後のは MSVCR80.DLL の間違いだと思いますが。
すいません。間違えていました。

実行先にPCではVCをインストールしておらず、なにもインストールできないので、で
きれば、スタティックライブラリでビルドしたいと考えています。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

今作っているプログラムは、インストーラが無く、圧縮ファイルを展開するだけで使用可
能、というような形態のものだと思います。
そこで展開したフォルダの中に、GLUT や SDL の DLL が入っていれば動く、それらの
DLL は圧縮ファイルに入っており、ユーザーが別途入れる必要は無い、というのでは NG
ですか?
圧縮ファイルを展開するだけの作業を「インストールする」と呼ばないなら、同じように
「GLUT や SDL の DLL をインストールする」作業も無いと言えるでしょう。
それとも、EXE ファイルひとつだけで動かなければなりませんか?

EXE ファイルひとつだけで動かす方法もあります。
が、面倒ですよ。GLUT や SDL については DLL を使うほうが、開発はずっと楽だと思い
ます。

それはそれとして。
「配布先には何もインストールできない」という制限はどこから来るのでしょうか?
そのような制約は不幸しか呼びません。
できるなら、「あらかじめ VC++ ランタイムをインストールしておく」という選択肢が許
容されるように変えていくのが、今後のことも考えるとよりよい道だと思います。


返信引用
lud
 lud
(@lud)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

>そこで展開したフォルダの中に、GLUT や SDL の DLL が入っていれば動く、それらの
>DLL は圧縮ファイルに入っており、ユーザーが別途入れる必要は無い、というのでは NG
>ですか?

それがベストだと考えています。

>できるなら、「あらかじめ VC++ ランタイムをインストールしておく」という選択肢が許
>容されるように変えていくのが、今後のことも考えるとよりよい道だと思います。

上の方に書いてあるアドレスのインストーラのことですよね?変えていきたいと思いま
す。しかし、一番いいのは配布ファイルだけで事足りるようにビルドすることだと考えて
います。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> それがベストだと考えています。

であれば、

> 実行先にPCではVCをインストールしておらず、なにもインストールできないので、
> できれば、スタティックライブラリでビルドしたいと考えています。

スタティックライブラリにする必要はありませんよね。

> EXE ファイルひとつだけで動かす方法もあります。
> が、面倒ですよ。GLUT や SDL については DLL を使うほうが、開発はずっと
> 楽だと思います。

これを実現するためにはスタティックライブラリにしなければならないのですが。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました