【问题标题】:Unresolved external png_set_longjmp_fn in libpnglibpng 中未解析的外部 png_set_longjmp_fn
【发布时间】:2011-07-08 14:43:53
【问题描述】:

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

这是怎么回事,我该如何解决?

【问题讨论】:

    标签: libpng unresolved-external


    【解决方案1】:

    更改了库以更好地隐藏内部结构。所以你需要做的是:

    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。所以我想我会在这里发布。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果有一天有人觉得这很有用,请为我的信息投票,这样我就会知道它值得放在这里。
      猜你喜欢
      • 2014-02-27
      • 2016-11-02
      • 2021-04-23
      • 2015-08-17
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      相关资源
      最近更新 更多