1

私のアプリケーションはlibjpegを使用してJPEG画像を読み書きします。すべてがうまくいきました

最近、jpeg_create_compress()を呼び出すときに「間違ったJPEGライブラリバージョン:ライブラリは80、呼び出し元は62を期待します」というエラーでJPEG画像を書き込もうとすると、アプリがクラッシュし始めました(したがって、クラッシュはlibjpeg側ではなく意図的な中止のようですセグメンテーション違反)

少し調べてみると、実際に私のアプリケーションはlibjpeg-62ヘッダー(/ usr / local / includeにインストールされている)に対してコンパイルされ、libjpeg-80(/ usr / lib / i386-linux-にインストールされている)のdylibを使用していることがわかりました。 gnu /)。

libjpeg-62ヘッダーを削除し、libjpeg-80ヘッダーを使用してコンパイルすると、問題が解決しました。

ただし、一部のエンドユーザーがアプリのコンパイル対象とは異なるライブラリバージョンをインストールしている場合でも、このようなクラッシュを防ぐことができるソリューションをいただければ幸いです。

1)致命的なエラーがあっても中止しないようにlibjpegを説得できれば素晴らしいと思います。例:次のようなもの

jpeg_abort_on_error(0);

2)または、正しいライブラリがインストールされているかどうかを非中止チェックします。

if(!jpeg_check_libraryversion()) return;

3)それが箱から出して実行できない場合は、コンパイル時のAPIバージョン(JPEG_LIB_VERSION)を実行時に検出された互換バージョンと手動でチェックすることで問題ありません。

残念ながら、APIでこれらのメソッドのいずれかを使用できるものを見つけることができませんでした。

私はただ盲目ですか、それとも完全に異なるものが必要ですか?

4

2 に答える 2

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);
  }
  /* ... */
}
于 2012-05-22T07:03:29.920 に答える
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

   }
于 2013-10-01T12:48:32.340 に答える