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

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

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

一些调查表明,我的应用程序确实针对libjpeg-62头文件(安装在/ usr / local / include中)进行编译,然后使用libjpeg-80中的dylib(安装在/ 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中找到任何允许我使用这些方法的东西。

我是盲人还是我需要完全不同的东西?

为error_exit设置error handling程序可防止应用程序崩溃。

(我的问题是我已经完成了加载function,但不是保存function,因此在保存期间出现问题时退出)。 类似下面的东西做了诀窍:

 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 (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); } /* ... */ } 
 #include "jpeglib.h" #include  // 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 }