今天闲着没事把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,没什么好处。