c++ - 使用某些静态库时在开罗出现段错误

标签 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 库时,程序会在上面指示的行中抛出段错误。

生成静态链接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() 的调用失败了。但我不知道为什么。

有什么想法吗?提前致谢

最佳答案

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

关于c++ - 使用某些静态库时在开罗出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33265930/

相关文章:

c++ - clock_gettime() CUDA 的时间问题

c - 如何创建低级目标文件?

c - 如何生成8字节的十六进制值?

c - 编译/链接时强制指定函数链接到指定库

delphi - 使用 Delphi 6 编译两次并在二进制文件上获得相同的校验和

c++ - 如何在满足 constnt 表达式的同时将整数传递给指针,传递给 std::array<double, integer>?

c++ - 段错误和神秘的循环行为

c++ - 发送接收调用时带有 C++ 字符串的垃圾文本

c++ - 使非客户区无效

c - 为什么 C 中 if 语句中的 (a == b == c) 不起作用?