分段错误将文本呈现到开罗上下文

Segmentation fault rendering text to cairo context

本文关键字:上下文 错误 文本 分段      更新时间:2023-10-16

这是我第一次使用pangomm,我正在尝试将一些文本渲染到Cairo::Context,但是当我尝试从Pango::Layout对象访问任何内容时,程序会抛出以下错误:

(process:7175): glibmm-CRITICAL **: 15:36:58.578: Glib::ObjectBase* Glib::wrap_create_new_wrapper(GObject*): assertion 'wrap_func_table != nullptr' failed
(process:7175): glibmm-WARNING **: 15:36:58.578: Failed to wrap object of type 'PangoLayout'. Hint: this error is commonlycaused by failing to call a library init() function.
[1]    7175 segmentation fault  ./a.out

我无法使用 gdb 回溯错误。

法典

#include <cairomm/cairomm.h>
#include <pangomm.h>
int main() {
  auto surf = Cairo::ImageSurface::create(Cairo::Format::FORMAT_ARGB32, 1920, 20);
  auto cr = Cairo::Context::create(surf);
  cr->set_source_rgb(0.0, 0.0, 0.0);
  cr->paint();
  cr->move_to(0.0, 0.0);
  cr->set_source_rgb(1.0, 1.0, 1.0);
  auto layout = Pango::Layout::create(cr);
  auto font = Glib::ustring("Sans Bold 27");
  Pango::FontDescription desc(font);
  layout->set_font_description(desc);
  auto text = Glib::ustring("Oi");
  layout->set_text(text);
  layout->show_in_cairo_context(cr);
  surf->write_to_png("test.png");
  return 0;
}

编译命令

g++ -g -Wall `pkg-config --cflags cairomm-1.0 pangomm-1.4` main.cpp `pkg-config --libs cairomm-1.0 pangomm-1.4`

由于您使用pangomm而不使用 Gtk,因此您需要在程序开始时初始化pangomm。这也初始化了Glib。呼叫Pango::init();并包括<pangomm/init.h>

因此,您的代码成为

...
#include <pangomm/init.h>
int main()
{
    Pango::init();
    ...
}