6

libpng.dllを動的にロードする場合、libpng13.dllからバージョン1.5にアップグレードした後、コンパイラーはこの未解決の外部の報告を開始しました:png_set_longjmp_fn

どうして、どうすれば修正できますか?

4

2 に答える 2

9

ライブラリは、内部構造をより適切に非表示にするように変更されました。だからあなたがする必要があるのはこれです:

typedef jmp_buf* (*png_set_longjmp_fnPtr)(png_structp png_ptr, png_longjmp_ptr longjmp_fn, size_t jmp_buf_size);

png_set_longjmp_fnPtr mypng_set_longjmp_fnPtr = 0;

次に、LoadLibraryを動的に実行する場合は、次のようにします。

mypng_set_longjmp_fnPtr = (png_set_longjmp_fnPtr) GetProcAddress(hpngdll, "png_set_longjmp_fn");

extern "C"
   {
   jmp_buf* png_set_longjmp_fn(png_structp png_ptr, png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)
      {
      if (mypng_set_longjmp_fnPtr)
         {
         return (*mypng_set_longjmp_fnPtr)(png_ptr, longjmp_fn, jmp_buf_size);
         }
      return 0;
      }
   }

未解決の外部を引き起こす次のコードは、再び正常に機能するようになりました。

if (setjmp(png_jmpbuf(png_ptr)))
    {

他の場所が見つからなかったので、ここに投稿しました。私は問題をグーグルで検索し、同じ問題に遭遇しているが解決策がない他の人々を見つけたので、彼らは再び古いバージョンのlibpngにダウングレードしました。だからここに投稿しようと思いました。

于 2011-03-04T06:47:40.007 に答える
6

もう 1 つの解決策は、libpng を動的にロードするのではなく、静的にリンクすることです。この場合、追加のメソッドは必要ありません。しかし、それにはライブラリが必要であり、必要なときだけではなく、常に libpng がロードされます。

于 2011-03-04T06:53:04.357 に答える