1

私はwin7 64ビットホームエディションを使用しています。私のプロジェクトはすべて、C++ を使用して 32 ビット環境でビルドするように設定されています。MDd ランタイムを使用して、デバッグ モードで libpng を正常にビルドしました。2 つのアクティブなプロジェクトがあります。私の最初のプロジェクトは VS2010 で、2 番目のプロジェクトは VS2012 です。私のコンピューター内で、このライブラリのパスに設定された環境変数を作成して、プロジェクトでのリンクを容易にしました。私のプロジェクトは両方とも MDd と、libpng が使用するのと同じマルチバイトを使用しています。私のパスと依存関係はすべて正しいです。また、ビルドされた実行可能ファイルと同じディレクトリ内の両方のプロジェクトに libpng16.dll をコピーしました。両方のプロジェクトを正常にコンパイルおよびビルドできます。私の VS2010 プロジェクトはロードされた PNG グラフィックを実行してレンダリングしますが、VS2012 のプロジェクトはそうではありません。

check = fread( data, 1, length, png_voidcast( png_FILE_p, png_ptr->io_ptr ) );

pngrio.c 内。このエラーを与える:

First-chance exception at 0x77308E19 (ntdll.dll) in Game_debug.exe: 0xC0000005: 
Access violation writing location 0x00000014.

私のVS2010プロジェクトで動作することがわかっており、VS2012プロジェクトでpngをロードするために同じ実装を使用しているため、問題はソースコード内にはありません。私がリンクしているライブラリがVS2010でビルドされたことが違いを生むのか、VS2010でビルドされたライブラリ内に私のVS2012プロジェクトが気に入らないコマンドライン/コンパイラ設定があるのか​​ 、私にはわかりません。私はpngのドキュメントを読み、何時間もオンラインで検索しましたが、関連するものは何も見つかりませんでした. あらゆる種類のヘルプ、ヒント、ポインター、または提案は、私に大いに役立ちます。

4

3 に答える 3

4

libpng ソース コードのファイル projects/vstudio/readme.txt、特に 41 行目から始まる段落を読みます。

おそらくpng_init_ioを使用して、(FILE *)をlibpngに渡しています。基になる FILE 構造にアクセスしようとすると、Visual Studio が fread 内でクラッシュします。

これは、ある Visual Studio ランタイムから fopen を使用して FILE* を作成したが、libpng が別の Visual Studio ランタイム (msvcrt など) に対してリンクされているためです。2 つのランタイムには互換性がありません。

これを発生させる方法は多数ありますが、zlib DLL を使用するとほぼ確実に発生します。プロジェクト/vstudio を使用して libpng をビルドしていますか、それとも自分でやろうとしましたか? プロジェクト/vstudio を使用していない場合は、自分でできます ;-)

1) libpng と zlib の両方を別々の DLL にビルドしないでください。静的 zlib に対して libpng DLL をリンクする (projects/vstudio が行うこと) か、プロジェクトで静的 libpng (DLL ではない) を使用します (projects/vstudio もこれらのいずれかをビルドします)。

2) さまざまな Visual Studio ランタイムについて調べます。実行するものはすべて、まったく同じランタイムを使用する必要があります。すべてのプロジェクトをチェックして、どのランタイムがあるかを確認してください。できればデフォルト (/MD) を使用してください

3) libpng でバグが発生したと思われる場合は、アプリケーションを静的にリンクし (つまり、Visual Studio によってビルドされた DLL を使用しないでください)、再試行してください。Windows DLL は問題ありません。すべてを壊すのは、Visual Studio ランタイムを使用する Visual Studio のものです。

4) 静的にリンクしたときに問題が発生した場合は、DEBUG 設定がどこでも同じであることを確認してください。MSVC ランタイムのデバッグ バージョン (Visual Studio より前のバージョンを含む) はリリース バージョンと互換性がないため、'n'max DEBUG を混在させることはできません。

実際、png_init_io を使用しない方が良いです。libpng はこれをサポートします。独自の読み取りおよび書き込みコールバックを提供します。fopen の呼び出しと同じ DLL (作成したもの) に実装されているため、これら (fread) で stdio を安全に使用できます。DLL の境界を越えて (FILE*) を渡さない限り、おそらく安全です。2 つの DLL (zlib、libpng) の動作を説明したり理解したりした人は誰もいません。

ジョン・ボウラー

于 2015-03-23T15:23:29.817 に答える