Неразрешенный внешний png_set_longjmp_fn в libpng - PullRequest
6 голосов
/ 04 марта 2011

При динамической загрузке libpng.dll после обновления с libpng13.dll до версии 1.5 компилятор начал сообщать об этом неразрешенном внешнем файле: png_set_longjmp_fn

Почему и как это исправить?

Ответы [ 2 ]

9 голосов
/ 04 марта 2011

Библиотека была изменена, чтобы лучше скрывать внутренние структуры.Итак, что вам нужно сделать, это:

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.Поэтому я подумал, что опубликую это здесь.

6 голосов
/ 04 марта 2011

Другое решение состоит в том, чтобы не загружать libpng динамически, а связывать его статически, в этом случае дополнительный метод не требуется.Но для этого нужна библиотека, и libpng всегда будет загружаться, а не только тогда, когда это необходимо.

...