使用一些静态库时,在cairo中出现段错误

时间:2015-10-21 17:45:19

标签: c++ c linker cairo xlib

我有以下例程来截取屏幕截图:

void take_screenshot(const std::string & file_name)
{
  Display *disp;
  Window root;
  cairo_surface_t *surface;
  int scr;

  disp = XOpenDisplay(nullptr);
  scr = DefaultScreen(disp);
  root = DefaultRootWindow(disp);

  surface = cairo_xlib_surface_create(disp, root, DefaultVisual(disp, scr),
                      DisplayWidth(disp, scr), 
                      DisplayHeight(disp, scr));
  cairo_surface_write_to_png(surface, file_name.c_str()); // <-- here is the seg fault
  cairo_surface_destroy(surface);
}

此例程取自https://stackoverflow.com/users/436275/uli-schlachter对此问题的答案Making a screenshot using Xlib and Cairo libs [fail](作者信用)

该例程是名为collector的程序的一部分。其链接如下:

clang -o collector -g -O2 -fno-strict-aliasing collector.o common-vars.o \
collector-events.o listeners.o active_window.o \
../lib/libperfq-common.a -lPocoNet -lPocoFoundation -luiohook\
-lstdc++ -lgsl -lgslcblas -lm -lcairo -lXt -lXtst -lXinerama \
-lX11 -lpthread -lc

到目前为止一切顺利。该计划运作良好。

但是,当我静态链接poco和uiohook库时,程序会在上面指定的行中引发seg错误。

poco和uiohook库静态链接的可执行文件产生如下:

clang -o collector -g -O2 -fno-strict-aliasing collector.o \
common-vars.o collector-events.o listeners.o active_window.o \
../lib/libperfq-common.a /home/lrleon/poco/lib/libPocoNet.a \
/home/lrleon/poco/lib/libPocoFoundation.a \
/home/lrleon/uiohook/lib/libuiohook.a -lstdc++ -lgsl -lgslcblas \
-lm -lcairo -lXt -lXtst -lXinerama -lX11 -lpthread -lc

对于这个版本,我有一个段错误。在切换一些动态库后,使用调试器观察,我确实知道导致错误的原因。

我想有些库静态链接会导致对cairo_surface_write_to_png()的调用失败。但我不明白为什么。

有什么想法吗?提前致谢

1 个答案:

答案 0 :(得分:1)

由于2.1分支中的xcb,我刚刚在linux上修补了崩溃。这可能会在2.1.1时解决您的问题。我建议尝试使用不包含xcb的2.0来查看是否能解决问题。