libpng中未解析的外部png_set_longjmp_fn

Kha*_*ish 6 unresolved-external libpng

在动态加载libpng.dll时,从libpng13.dll升级到1.5版之后,编译器开始报告这个未解析的外部:png_set_longjmp_fn

我该怎么办呢?

Kha*_*ish 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;
Run Code Online (Sandbox Code Playgroud)

然后,当您动态执行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;
      }
   }
Run Code Online (Sandbox Code Playgroud)

导致未解析的外部的以下代码现在将再次正常工作:

if (setjmp(png_jmpbuf(png_ptr)))
    {
Run Code Online (Sandbox Code Playgroud)

我在这里发布了这个,因为我找不到其他位置.我用Google搜索了问题,发现其他人遇到了同样的问题,但没有解决方案,所以他们只是再降级到旧版本的libpng.所以我想我会在这里发布.


Kha*_*ish 6

另一个解决方案是不动态加载libpng,而是静态链接它,在这种情况下,不需要额外的方法.但这需要库和libpng将始终加载而不是仅在需要时加载.