> EXE ファイルひとつだけで動かす方法もあります。
> が、面倒ですよ。GLUT や SDL については DLL を使うほうが、開発はずっと
> 楽だと思います。
開発が楽な方がうれしいので、EXEファイル一つにする方法はやめておきます。
> msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit は既に LIBCMT.lib(crt0dat.obj)
> で定義されています。
>というエラーが出ますか?
同じエラーがでました。
>もし出る場合、VC++ で新しいプロジェクトを作って、コードには空っぽの main 関数だ
>け書いて、ランタイムライブラリを /MT にして、
>・SDL だけリンクした場合
>・GLUT だけリンクした場合
>でもエラーが出るかどうか教えてください。
試せるのは明日になります。すいません。
色々ご迷惑おかけしますが、よろしくお願いします。
>SDLだけリンクした場合のソース
#include <SDL.h>
#pragma comment(lib, sdl.lib)
#pragma comment(lib, sdlmain.lib)
int main( int argc, char **argv ){
return 0;
}
以下のエラーが出ました。
error LNK2005: _isspace は既に LIBCMT.lib(_ctype.obj) で定義されています。
msvcrt.lib
error LNK2005: _exit は既に LIBCMT.lib(crt0dat.obj) で定義されています。 msvcrt.lib
warning LNK4098: defaultlib 'msvcrt.lib' は他のライブラリの使用と競合していま
す。/NODEFAULTLIB:library を使用してください。 LIBCMT.lib
>GLUTだけリンクした場合のソース
#include <stdio.h>
#include<GL/glut.h>
#pragma comment(lib, opengl32.lib)
#pragma comment(lib, glu32.lib)
int main(void){
return 0;
}
こちらはエラーが出ずビルドできました。
うーむ…
どうも、SDL-devel-1.2.13-VC8 が怪しいです。
SDL.DLL を Dependency Walker で開くと、MSVCRT.DLL にリンクしているのがわかりま
す。
が、これが VC++ 2005 SP1 でビルドされたものであれば、MSVCR80.DLL にリンクしてい
なければならないはずです。
どうも、名前に反して、VC++ 2005 でビルドされたものではないのではないか、という気
がしてきました。
おそらく、SDLmain.lib がリンクしている CRT が、VC++ 2005 SP1 のものではないので
しょう。
そのため、その CRT と、今作っているプログラムの CRT に不一致が生じていることが、
LNK2005 の原因と思われます。
対策は…SDL をソースコードからビルドし直すしかないですかね。
SDL-1.2.13.zip をダウンロードして展開し、その中の VisualC.zip を展開し、SDL.sln
をビルドするのですが、どうも DirectX SDK が必要なようです。面倒ですね。
DirectX SDK はここから入手できます。
http://www.microsoft.com/japan/msdn/directx/downloads.aspx
最新の March 2008 でビルドできることを確認しました。
また、ランタイムライブラリを /MT にするためには、SDL および SDLmain も /MT にし
なければなりません。
デフォルトでは /MD になっているので、ビルドする際に変更してください。
SDL のビルド手順です。
1:DirectX SDK をインストールする。
標準のインストールパスは
C:\Program Files\Microsoft DirectX SDK (March 2008)\
です。変更した場合は、インストール先を控えておきましょう。
なお、これは配布先のマシンにインストールする必要はありません。
2:SDL のソースコードを展開する。
SDL-1.2.13.zip を展開し、その中の VisualC.zip も展開します。
この時、展開に使うソフトの設定によっては、VisualC ディレクトリが2重にできてしま
うことがあります。
ソフトの「書庫名でディレクトリを作る」ような機能は OFF にしてください。
もし、2重にできてしまったら、正しい位置に移動してください。
SDL 展開ディレクトリ
├build-scripts
├docs
├include
├src
├test
├VisualC
|├SDL
|├SDLmain
|├tests
|├SDL.sln
|└SDL.dsw
├VisualC.zip
└README等、その他のファイル
となっているのが正解です。
3:SDL.sln をビルド
VisualC ディレクトリの中の SDL.sln を開きます。
ランタイムライブラリを /MT にしたいなら、SDL、SDLmain の両プロジェクトのランタイ
ムライブラリも /MT にします。
デバッグ構成では /MTd、リリース構成では /MT にするのがよいでしょう(今作っている
プログラムも同じにする)。
また、SDL プロジェクトのプロパティを開き、
・C/C++ → 全般 → 追加のインクルード ディレクトリに、DirectX SDK の Include デ
ィレクトリを
・リンカ → 全般 → 追加のライブラリ ディレクトリに、DirectX SDK Lib ディレクト
リを
それぞれ追加します。
で、ビルドすれば、SDL.dll、SDL.lib、SDLmain.lib ができるはずです。
あとは、ここでできた dll と lib を使ってプログラムをビルドすれば、たぶんエラーは
解消します。
>また、ランタイムライブラリを /MT にするためには、SDL および SDLmain も /MT にし
>なければなりません。
>デフォルトでは /MD になっているので、ビルドする際に変更してください。
これはどうやってやるんですか?VCの設定を変更すればいいんですか?
ご自分で作られているプロジェクトの設定を変更する方法はわかりますよね?
SDL.sln を開いて、それぞれのプロジェクトの設定を同じように変更すればよいのです。
>それぞれ追加します。
>で、ビルドすれば、SDL.dll、SDL.lib、SDLmain.lib ができるはずです。
この3つを使用してビルドしたEXEファイルは開発環境のないPCでも実行できました。
いろいろと丁寧にご指導頂いて本当にありがとうございました。
質問させて頂く機会が、もしまたありましたら、
その際もお手数ですがよろしくお願いします。
本当にありがとうございました。