2012-04-26 28 views
1

我的應用程序使用libjpeg讀取/寫入JPEG圖像。一切工作正常在運行時找出libjpeg版本(或其他方式來防止終止)?

最近我的應用程序開始崩潰時試圖寫入錯誤「錯誤的JPEG庫版本:庫是80,調用者期望62」時調用jpeg_create_compress()(所以崩潰似乎是故意的在libjpeg端而不是segfault)

有點調查顯示,我的應用程序確實是針對libjpeg-62頭文件(安裝在/ usr/local/include中)編譯的,然後使用libjpeg中的dylibs -80(安裝在/ 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

我這個標記爲「Debian的」顯示爲基於Debian的系統上的問題;前段時間debian從libjpeg62過渡到libjpeg8) – 2012-04-26 11:59:23

+3

然後靜態鏈接到jpeg庫。 – BeRecursive 2012-04-26 12:00:29

+0

這不是一個簡單的問題!你想要做的並不一定是不可能的,但它確實傾向於削弱Debian系統的粒度,不是嗎?祝你好運。 – thb 2012-04-26 12:01:35

回答

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
#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 

    } 
相關問題