解決windows上靜態連結cairo不顯示東西的問題

網事已瘋發表於2015-05-13

今天閒著沒事把cairo靜態編譯了一把,但是沒想到靜態連結後用不起來,本來用cairo畫圖好好的現在卻變成了白板一張..除錯了一下看是進入了cairo_win32_surface_create這個函式之後就沒有返回,不過仔細想了下呼叫dll沒問題但是靜態連結就有問題,八成是在載入dll的時候初始化了什麼東西,但是static連結沒有初始化,那手動初始化一下應該就可以了。於是開啟notepad++在cairo原始碼中搜DllEntry,發現果然有初始化一個mutex

BOOL WINAPI
DllMain (HINSTANCE hinstDLL,
         DWORD     fdwReason,
         LPVOID    lpvReserved)
{
    switch (fdwReason) {
        case DLL_PROCESS_ATTACH:
            CAIRO_MUTEX_INITIALIZE ();
            break;

        case DLL_PROCESS_DETACH:
            CAIRO_MUTEX_FINALIZE ();
            break;
    }

    return TRUE;
}

那事情就好說了,在程式開始的地方呼叫CAIRO_MUTEX_INITIALIZE (),結束的地方呼叫CAIRO_MUTEX_FINALIZE (),重新編譯,一切正常。

另外還發現了一個方法,在cairo_win32_surface_create之前呼叫一遍cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0)也能解決問題,原因不知道...不過這不是正常的解決方法,而且還要費勁去釋放這個surface,沒什麼好處。

相關文章