使用某些静态库时,在cairo中出现Seg错误

Seg fault in cairo when using some static libraries

本文关键字:cairo 错误 Seg 静态      更新时间:2023-10-16

我有以下例程用于截图:

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对这个问题的回答,使用Xlib和Cairo库制作屏幕截图[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()调用失败的事实。但我不知道为什么。

任何想法?提前感谢

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