我的应用程序使用libjpeg来读/写JPEG图像。一切正常
最近我的应用程序在尝试编写JPEG图像时出现崩溃,错误“错误的JPEG库版本:库是80,调用者期望62”,当调用jpeg_create_compress()时(因此崩溃似乎是对libjpeg的故意中止方而不是段错误
一些调查表明,我的应用程序确实针对libjpeg-62头文件(已安装在/ usr / local / include中)编译,然后使用libjpeg-80中的dylibs(安装在/ usr / lib / i386中) -linux-GNU /).
删除libjpeg-62标头并使用libjpeg-80标头进行编译解决了这个问题。
然而,我希望有一个解决方案可以防止此类崩溃,即使某些最终用户安装的库版本不同于我编译的应用程序。
1)如果我能以某种方式说服libjpeg即使在致命错误上也不会中止,那将是很棒的; 例如类似的东西:
jpeg_abort_on_error(0);
2)或进行非中止检查是否安装了正确的库:
if(!jpeg_check_libraryversion()) return;
3)如果开箱即不可行,我可以根据运行时检测到的compat版本手动检查编译时API版本(JPEG_LIB_VERSION)。
遗憾的是,我无法在API中找到允许我使用其中任何一种方法的任何内容。
我只是盲目还是我需要完全不同的东西?
答案 0 :(得分:1)
为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);
}
/* ... */
}
答案 1 :(得分:1)
#include "jpeglib.h"
#include <iostream>
// JPEG error handler
void JPEGVersionError(j_common_ptr cinfo)
{
int jpeg_version = cinfo->err->msg_parm.i[0];
std::cout << "JPEG version: " << jpeg_version << std::endl;
}
int main(int argc, char* argv[])
{
// Need to construct a decompress struct and give it an error handler
// by passing an invalid version number we always trigger an error
// the error returns the linked version number as the first integer parameter
jpeg_decompress_struct cinfo;
jpeg_error_mgr error_mgr;
error_mgr.error_exit = &JPEGVersionError;
cinfo.err = &error_mgr;
jpeg_CreateDecompress(&cinfo, -1 /*version*/, sizeof(cinfo)); // Pass -1 to always force an error
}