动态加载 libpng.dll 时,从 libpng13.dll 升级到 1.5 版后,编译器开始报告这个未解析的外部:png_set_longjmp_fn
怎么会,我该如何解决?
动态加载 libpng.dll 时,从 libpng13.dll 升级到 1.5 版后,编译器开始报告这个未解析的外部:png_set_longjmp_fn
怎么会,我该如何解决?
更改了库以更好地隐藏内部结构。所以你需要做的是:
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。所以我想我会把它贴在这里。
另一种解决方案是不动态加载 libpng,而是静态链接它,在这种情况下,不需要额外的方法。但这需要库和 libpng 将始终加载,而不是仅在需要时加载。