ぼく用あれこれまとめ

Vorbisライブラリビルド編)

最終更新:

bokuyo

- view
管理者のみ編集可

こうして僕はエラーにはまった。(Ogg/Vorbisライブラリビルド編)


はじめに

  • このページは2010年の12月ごろにエラーにはまった際のログを残しているページです。
  • そのせいかなんだか見にくいです。
  • それと無知ゆえに嘘ばかり書いています。うのみにしないでください。
  • Ogg/Vorbis のビルド手順だけをまとめた項目が見たい方は以下のページをご参照ください。

ぼくの環境編

  • VisualC++2010 Express
    • これを使ってOggとVorbisをインストール(というよりも、プログラムで使うライブラリをビルドしちゃおう)な感じです。

ダウンロード/解凍編

  • http://www.xiph.org/downloads/より、「libogg-1.2.2.zip」「libvorbis-1.3.2.zip」をダウンロードした。そんでもって解凍。
  • 「libogg-1.2.2」「libvorbis-1.3.2」の2つのフォルダができた。
  • フォルダ名に「.」だの「-」だのが入ってて気持ち悪かったので「libogg」「libvorbis」にフォルダ名をそれぞれ変更。


LibOgg(DLL)ビルド編

  • libogg>win32>VS2010>libogg_dynamic.slnをVC++2010 Expressにて開く。
  • VC++の"出力"欄に以下のように書かれている…。なにこれ…。
C:\libogg\win32\VS2010\libogg_dynamic.vcxproj : warning  : プロジェクト ファイル 'libogg' で参照されているプラットフォーム 'x64' が見つかりません。
プラットフォームが '%VCTargetsPath%\Platforms\x64\' にインストールされていることを確認してください。


どうやら
  • 通常のVC++2010 Expressでは64bit向けのソフトウェアが作れないみたい。
  • なので、64bit向けに作れるように、Windows SDK7.1を導入することに。
そもそも
  • DirectXやら何やら、いろんなところでよく見かける「x86」「x64」というのはインテルが作った"規格(…のようなもの)"のことだそうで。
    • とりあえず、「x86」は"32bit"、「x64」は"64bit"という認識さえ持っておけば十分かな、って思う。
  • ちなみにWindows SDK7.1はダウンロードサイズは500KBほどと小さいのだけども、インストールすると1.6GBも必要になるから要注意。

そんなこんなで
  • WindowsSDK7.1を導入後、libogg_dynamic.slnを開いてみると、VC++たんに何も言われなかった。ちょっとだけ悲しい。
  • ひとまずdefaultのままビルドしてみることに。

Debugでビルドしてみた。(/MDd)

1>------ ビルド開始: プロジェクト: libogg, 構成: Debug Win32 ------ 
1> framing.c 
1> bitwise.c 
1> コードを生成中... 
1>bitwise.obj : warning LNK4075: /EDITANDCONTINUE は /OPT:ICF の指定によって無視されます。 
1> ライブラリ C:\libogg\win32\VS2010\Win32\Debug\libogg.lib とオブジェクト C:\libogg\win32\VS2010\Win32\Debug\libogg.exp を作成中 
1> libogg_dynamic.vcxproj -> C:\libogg\win32\VS2010\Win32\Debug\libogg.dll 
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

Releseでビルドしてみた。(/MD)

1>------ ビルド開始: プロジェクト: libogg, 構成: Release Win32 ------
1>  bitwise.c
1>  framing.c
1>     ライブラリ C:\libogg\win32\VS2010\Win32\Release\libogg.lib とオブジェクト C:\libogg\win32\VS2010\Win32\Release\libogg.exp を作成中
1>  コード生成しています。
1>  コード生成が終了しました。
1>  libogg_dynamic.vcxproj -> C:\libogg\win32\VS2010\Win32\Release\libogg.dll
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

とりあえずおっけー?
C:\libogg\win32\VS2010\Win32\Debug\libogg.lib
C:\libogg\win32\VS2010\Win32\Debug\libogg.dll
C:\libogg\win32\VS2010\Win32\Release\libogg.lib
C:\libogg\win32\VS2010\Win32\Release\libogg.dll
  • ちゃんとできてました。使えるかどうかは使ってないのでまだわかりませんがとりあえずおっけー。



LibOgg(Static)ビルド編

  • libogg>win32>VS2010>libogg_static.slnをVC++2010 Expressにて開く。
  • "LibOgg(DLL)ビルド編"でWindowsSDK7.1を導入したおかげか、.slnを開いた時点では何も出力がなかった。ありがたき幸せ。
  • ひとまず、defaultの設定でビルドすることに。

Debugでビルドしてみた。(/MDd)

1>------ ビルド開始: プロジェクト: libogg_static, 構成: Debug Win32 ------
1>  framing.c
1>  bitwise.c
1>  コードを生成中...
1>  libogg_static.vcxproj -> C:\libogg\win32\VS2010\Win32\Debug\libogg_static.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

Releseでビルドしてみた。(/MD)

1>------ ビルド開始: プロジェクト: libogg_static, 構成: Release Win32 ------
1>  bitwise.c
1>  framing.c
1>  libogg_static.vcxproj -> C:\libogg\win32\VS2010\Win32\Release\libogg_static.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

ま、まあ、とりあえず…
C:\libogg\win32\VS2010\Win32\Debug\libogg_static.lib
C:\libogg\win32\VS2010\Win32\Release\libogg_static.lib
  • おっけーなのかしらね…。
  • でも、このように「/MD」で作ったlibogg_static.libを使用するプログラムが「/MT」だった場合、どうなるんでしょう??
  • この疑問は、いったん保留して次のをビルドします。



LibVorbis(DLL)ビルド編

  • C:\libvorbis\win32\VS2010\vorbis_dynamic.slnをVC++2010 Expressにて開く。
  • これまたVC++の出力欄には何も表示されず、なんなく開けちゃった☆

Debugでビルドしてみた。(/MDd)

1>------ ビルド開始: プロジェクト: libvorbis, 構成: Debug Win32 ------
1>  window.c
(…300行にわたるほど長すぎるので中略。)
========== ビルド: 4 正常終了、0 失敗、0 更新不要、0 スキップ ==========

Releseでビルドしてみた。(/MD)

1>------ ビルド開始: プロジェクト: libvorbis, 構成: Release Win32 ------
1>  analysis.c
(…これまた70行ほどあって長すぎるので中略。)
4>  コード生成しています。
4>  コード生成が終了しました。
4>  vorbisenc_dynamic.vcxproj -> C:\libvorbis\win32\VS2010\Win32\Release\vorbisenc.exe
========== ビルド: 4 正常終了、0 失敗、0 更新不要、0 スキップ ==========

とりあえずおっけー?
C:\libvorbis\win32\VS2010\Win32\Debug\libvorbis.lib
C:\libvorbis\win32\VS2010\Win32\Debug\libvorbis.dll
C:\libvorbis\win32\VS2010\Win32\Debug\libvorbisfile.lib
C:\libvorbis\win32\VS2010\Win32\Debug\libvorbisfile.dll
C:\libvorbis\win32\VS2010\Win32\Release\libvorbis.lib
C:\libvorbis\win32\VS2010\Win32\Release\libvorbis.dll
C:\libvorbis\win32\VS2010\Win32\Release\libvorbisfile.lib
C:\libvorbis\win32\VS2010\Win32\Release\libvorbisfile.dll
  • それぞれできてるっぽいから一応おっけーなのかしら?



LibVorbis(Static)ビルド編

  • C:\libvorbis\win32\VS2010\vorbis_static.slnをVC++2010 Expressにて開く。
  • .slnを開いた時点では、VC++は何も言ってこなかった。ほっと安心。
  • ひとまず、defaultの設定でビルドすることに。

Debugでビルドしてみた。(/MDd)

1>------ ビルド開始: プロジェクト: libvorbis_static, 構成: Debug Win32 ------
1>  window.c
(…長いので中略。)
4>  vorbisenc_static.vcxproj -> C:\libvorbis\win32\VS2010\Win32\Debug\vorbisenc.exe
========== ビルド: 4 正常終了、0 失敗、0 更新不要、0 スキップ ==========

Releseでビルドしてみた。(/MD)

1>------ ビルド開始: プロジェクト: libvorbis_static, 構成: Release Win32 ------
1>  analysis.c
(…長いので中略。)
1>  libvorbis_static.vcxproj -> C:\libvorbis\win32\VS2010\Win32\Release\libvorbis_static.lib
========== ビルド: 1 正常終了、0 失敗、3 更新不要、0 スキップ ==========
まさかの
C:\libvorbis\win32\VS2010\Win32\Debug\libvorbis_static.lib
C:\libvorbis\win32\VS2010\Win32\Debug\libvorbisfile_static.lib
C:\libvorbis\win32\VS2010\Win32\Release\libvorbis_static.lib

  • おや…!?Releseフォルダに以下のファイルが見当たらない!!!これはやっぱり、失敗だ!
C:\libvorbis\win32\VS2010\Win32\Release\libvorbisfile_static.lib



ということで
  • libvorbis_static
  • libvorbisfile
  • vorbisdec
  • vorbissenc
それぞれのプロジェクトのプロパティを開いて、
「構成プロパティ>C/C++>全般>追加のインクルード ディレクトリ」で
  • C:\libvorbis\include
  • C:\libogg\include
  • 上の2つをちゃんと追加してみる。もちろんdefaultで指定はされてはいるのだけど、一応ね。
  • 以下のそれぞれで追加のインクルードディレクトリを指定して、もう一度DebugとReleaseをしてみる。
  • ソリューション構成:Debug
  • ソリューション構成:Release

Debugでビルドしてみた。(2回目)(/MDd)

Releseでビルドしてみた。(2回目)(/MD)

えーと
  • リンカがどうのこうのっていう警告がちょっと怪しいけども、とりあえずは成功っぽいねー。
  • Releseフォルダに以下のファイルがあるのを確認しました。
C:\libvorbis\win32\VS2010\Win32\Release\libvorbisfile_static.lib
  • では実際に使ってみたいと思います。


実際に使ってみる。

test.exe の 0x561ac9d0 (msvcr100d.dll) で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
test.exe の 0x561ac9d0 (msvcr100d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
  • ビルドはうまくいくのに、デバッグ中にエラー発生。
ブレークポイントはさめながらみてる限り、
ov_fopen( "bgm.ogg", oggVorbisFile );
  • この時点でエラー起こしてるっぽい。
  • ってことで、/MTでライブラリを生成してみることに。


めんどうなのでStaticのReleaseのみ生成。

  • libogg_static.slnを開く。
  • プロパティ>構成プロパティ>C/C++>コード生成>ランタイムライブラリ>/MT
  • Releaceをビルド。
1>------ ビルド開始: プロジェクト: libogg_static, 構成: Release Win32 ------
1>  bitwise.c
1>  framing.c
1>  libogg_static.vcxproj -> C:\libogg\win32\VS2010\Win32\Release\libogg_static.lib
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

  • vorbis_static.slnを開く。
  • 4つのプロジェクトそれぞれにたいして、プロパティ>構成プロパティ>C/C++>コード生成>ランタイムライブラリ>/MT
  • Releaceをビルド。
  • ビルド結果全部みる->libvorbis_static_Release_BuildResult_201012200344.txt


すると、なんと!

testプログラムをRelease(/MT)で動かすと。

test.exe の 0x0003823e で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
test.exe の 0x0003823e でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。

testプログラムをDebug(/MTd)で動かすと。

1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>libcmt.lib(invarg.obj) : error LNK2005: __initp_misc_invarg は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __call_reportfault は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __invalid_parameter は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>  libogg_static.lib(framing.obj) : MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカーのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。
1>libcmt.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __initp_misc_invarg は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __call_reportfault は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: __invalid_parameter は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。
1>LIBCMTD.lib(crt0init.obj) : warning LNK4098: defaultlib 'libcmt.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>C:\Documents\Visual Studio 2010\Projects\test\Debug\test.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

ちなみに、Debug(/MDd)でも。

1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(ftell.obj) : error LNK2005: _ftell は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>  libogg_static.lib(framing.obj) : MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカーのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。
1>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(ftell.obj) : error LNK2005: _ftell は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。
1>libcmt.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>libcmt.lib(exsup.obj) : error LNK2005: __except_list は既に MSVCRTD.lib(dllsupp.obj) で定義されています。
1>libcmt.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。
1>LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'libcmt.lib' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>libcmt.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です。
1>C:\Documents\Visual Studio 2010\Projects\test\Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

どうやら
  • ライブラリを/MTでReleaseしたのは間違いっぽい。


気を取り直して

  • LibVorbis(Static)ビルド編まで戻る。/MD(/MDd)にすべて戻して
  • またライブラリとしてテストプログラムに組み込む。
  • とりあえず、特定のライブラリを無視するために、
  • プロジェクト>プロパティ>リンカー>入力>特定の既定のライブラリの無視>編集>MSVCRT(またはmsvcrt.lib)>OK
/GLってやってるみたいだから、
  • プロジェクト>プロパティ>構成プロパティ>リンカー>コマンドライン>追加オプション>/LTCG>OK
  • これでテストプログラムをビルドすると、
1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>  WinMain.cpp
1>  コード生成しています。
1>  コード生成が終了しました。
1>  test.vcxproj -> C:\documents\visual studio 2010\Projects\test\Debug\test.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
  • おっけーっぽい。
  • でもやっぱりランタイムエラーでちゃうっぽい。
test.exe の 0x6edc01d0 (msvcr100.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
ってことは、oggを使ってるプログラム自体が間違ってる、としか言いようがないよね。



きっと、ぼくが書いたプログラムが間違ってるはず。

  • そもそも、どんなプログラムを書いているのか、というと…
OggVorbis_File* ovf = NULL;
char* filename = "bgm.ogg";
int error = ov_fopen( filename, ovf );
  • で、冷静に考えてみて、ov_fopen関数の第二引数にいれてるovfが間違ってるのでは…?と思いまして…。
  • ここ、もしや、確保された構造体のアドレスを渡してあげないといけないんじゃ…、と。
  • 今はNULLの入った構造体のポインタ渡してるけれど、これじゃいつまでたっても0x00000000(=NULL番地)みたいなところにアクセスしちゃうはずだよねー、って思った。だから、深く考えず
OggVorbis_File ovf;
char* filename = "bgm.ogg";
int error = ov_fopen( filename, &ovf );
  • または、
OggVorbis_File* ovf = new OggVorbis_File();
char* filename = "bgm.ogg";
int error = ov_fopen( filename, ovf );
  • って感じで。これで通してみたら、
  • 「int error = 0」の値で問題なく、ランタイムエラーも出ずに、めでたしめでたしうまくいきましたとさ。

  • なんだそういうことかよ、ってオチ。(終)



つづき。

  • lib生成時に、/MT(/MTd)でしないとテストプログラムを/MTでビルドするときビルドエラーが起きる。
  • なのでogg/vorbisのlibを/MTでまたビルドし直す。
    • libogg_dynamicをDebug(/MTd)でビルド、Releace(/MT)でビルド。正常終了。
    • libogg_staticをDebug(/MTd)でビルド、Releace(/MT)でビルド。正常終了。

    • vorbis_dynamicをDebug(/MTd)でビルド。castにたいして警告いっぱいでたけど4つとも正常終了。
    • vorbis_dynamicをReleace(/MT)でビルド。とくにいっぱい警告も出ず、4つとも正常終了。
      • 備考:どのプロジェクトも「特定の既定のライブラリ」は何も指定してない。

    • vorbis_dynamicをDebug(/MTd)でビルド。castにたいして警告いっぱいでたけど4つとも正常終了。
    • vorbis_dynamicをReleace(/MT)でビルド。castにたいして警告いっぱいでたけど、4つとも正常終了。
      • 備考:どのプロジェクトも「特定の既定のライブラリ」は何も指定してない。

これで/MT(/MTd)のプログラムで使えます。おわりー。


関連リンク



コメント

名前:
コメント:
記事メニュー
目安箱バナー