gpt4 book ai didi

c - 在运行时找出 libjpeg 版本(或其他防止中止的方法)?

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:06 25 4
gpt4 key购买 nike

我的应用程序使用 libjpeg 来读/写 JPEG 图像。一切正常

最近我的应用程序在尝试写入 JPEG 图像时开始崩溃,并在调用 jpeg_create_compress() 时出现错误“JPEG 库版本错误:库为 80,调用者期望 62”(因此崩溃似乎是 libjpeg 上的故意中止边而不是段错误)

一些调查表明我的应用程序确实是针对 libjpeg-62 header (安装在/usr/local/include 中)编译的,然后使用 libjpeg-80 中的 dylib(安装在/usr/lib/i386 中) -linux-gnu/).

删除 libjpeg-62 header 并使用 libjpeg-80 header 进行编译解决了问题。

但是,我希望有一个解决方案可以防止此类崩溃,即使某些最终用户安装的库版本与我的应用程序的编译版本不同。

1) 如果我能以某种方式说服 libjpeg 即使在出现 fatal error 时也不会中止,那就太好了;例如像这样的东西:

jpeg_abort_on_error(0);

2) 或进行非中止检查是否安装了正确的库:

if(!jpeg_check_libraryversion()) return;

3) 如果这不是开箱即用的,我可以根据运行时检测到的兼容版本手动检查编译时 API 版本 (JPEG_LIB_VERSION)。

不幸的是,我无法在 API 中找到任何允许我使用这些方法的内容。

我只是瞎了眼还是我需要完全不同的东西?

最佳答案

为 error_exit 设置错误处理程序可防止应用程序崩溃。

(我的问题是我为加载功能完成了此操作,但没有用于保存功能,因此当保存过程中出现问题时它会退出)。像下面这样的东西成功了:

struct my_error_mgr {
struct jpeg_error_mgr pub; // "public" fields
jmp_buf setjmp_buffer; // for return to caller
};
typedef struct my_error_mgr * my_error_ptr;

METHODDEF(void) my_error_exit (j_common_ptr cinfo) {
my_error_ptr myerr = reinterpret_cast<my_error_ptr> (cinfo->err);
/* Return control to the setjmp point */
longjmp(myerr->setjmp_buffer, 1);
}

/* ... */

void jpeg_save(const char*filename, struct image*img) {
/* ... */
/* We set up the normal JPEG error routines, then override error_exit */
my_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;

/* Establish the setjmp return context for my_error_exit to use. */
if ( setjmp(jerr.setjmp_buffer) ) {
/* If we get here, the JPEG code has signaled an error.
* We need to clean up the JPEG object, close the input file, and return. */
jpeg_destroy_compress(&cinfo);
if(outfile)fclose(outfile);
return(false);
}
/* ... */
}

关于c - 在运行时找出 libjpeg 版本(或其他防止中止的方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10332908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com