[英]mupdf on linux segmentation fault
我在VMware上安装了一个运行Ubuntu 1804x64的操作系统,使用Mupdf1.17构建成功,Qt版本是5.9.8,通过命令sudo apt-get install qt5-default qtcreator
我的代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
#include <QImage>
#include <QPixmap>
#include <QLabel>
#include "mupdf/fitz.h"
#include "mupdf/pdf.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
char *input = const_cast< char* >("/home/john/work/123.pdf");
float zoom, rotate;
int page_number, page_count;
fz_context *ctx;
fz_document *doc;
fz_pixmap *pix;
fz_matrix ctm;//0
int x, y;
page_number=0;
//100%
zoom=100;
//0
rotate=0;
//
ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
if (!ctx)
{
qDebug()<<stderr<<"cannot create mupdf context";
return;
}
//
fz_try(ctx)
fz_register_document_handlers(ctx);
fz_catch(ctx)
{
qDebug()<<stderr<<"cannot register document handlers:"<< fz_caught_message(ctx);
fz_drop_context(ctx);
return;
}
//
fz_try(ctx)
doc = fz_open_document(ctx, input);
fz_catch(ctx)
{
qDebug()<<stderr<< "cannot open document:"<< fz_caught_message(ctx);
fz_drop_context(ctx);
return;
}
//
fz_try(ctx)
page_count = fz_count_pages(ctx, doc);
fz_catch(ctx)
{
qDebug()<<stderr<< "cannot count number of pages:"<< fz_caught_message(ctx);
fz_drop_document(ctx, doc);
fz_drop_context(ctx);
return;
}
QString str;
str = str.setNum(page_count);
ui->textlabel->setText(str);
if (page_number < 0 || page_number >= page_count)
{
qDebug()<<stderr<< "page number out of range: "<< page_number + 1<<"page count:"<<page_count;
fz_drop_document(ctx, doc);
fz_drop_context(ctx);
return;
}
//
ctm=fz_scale(zoom / 100, zoom / 100);
ctm=fz_pre_rotate(ctm, rotate);
//pixmap
fz_try(ctx)
pix = fz_new_pixmap_from_page_number(ctx, doc, page_number, ctm, fz_device_rgb(ctx), 0);
fz_catch(ctx)
{
qDebug()<<stderr<< "cannot render page: %s\n"<< fz_caught_message(ctx);
fz_drop_document(ctx, doc);
fz_drop_context(ctx);
return;
}
//
//unsigned char *samples = fz_pixmap_samples(ctx, pix);
unsigned char *samples = pix->samples;
int width = fz_pixmap_width(ctx, pix);
int height = fz_pixmap_height(ctx, pix);
str = str.setNum(width);
QString wid;
wid=wid.setNum(width);
ui->widthlabel->setText("width: "+wid);
QString hei;
hei=hei.setNum(height);
ui->heightlabel->setText("height: "+hei);
QImage image(samples, width, height,pix->stride,QImage::Format_RGB888);
QLabel *label=new QLabel;
label->setPixmap(QPixmap::fromImage(image));
ui->layout->addWidget(label); // if (!image.save("a.png")) { // return; // } //
ui->textlabel->setText("Pdf open success");
fz_drop_pixmap(ctx, pix);
fz_drop_document(ctx, doc);
fz_drop_context(ctx);
}
MainWindow::~MainWindow()
{
delete ui;
}
发生分段错误。奇怪的是我安装了Qt5.14.2.运行官方安装包,并用Qt5.14重建然后程序运行正确没有分段错误。
My truly current environment is a Linux system with Arm architecture,no official install package to install qt only installed by command. 那是 Qt 错误吗?
1 do_scavenging_malloc 0x44b5f0
2 fz_calloc_no_throw 0x44b75e
3 hb_face_create_for_tables 0x642237
4 hb_qt_face_get_for_engine(QFontEngine *) 0x7ffff76712ea
5 QFontEngine::harfbuzzFace() const 0x7ffff75b9e00
6 ?? 0x7ffff3ca2447
7 ?? 0x7ffff3ca6f3a
8 ?? 0x7ffff3caba57
9 ?? 0x7ffff75d7244
10 QFontDatabase::findFont(QFontDef const&, int) 0x7ffff75d7760
11 QFontDatabase::load(QFontPrivate const *, int) 0x7ffff75d7e26
12 QFontPrivate::engineForScript(int) const 0x7ffff75ab9ab
13 QFontMetricsF::leading() const 0x7ffff75cd0a1
14 ?? 0x7ffff775f22f
15 QPainter::drawText(QRect const&, int, QString const&, QRect *) 0x7ffff7760206
16 QStyle::drawItemText(QPainter *, QRect const&, int, QPalette const&, bool, QString const&, QPalette::ColorRole) const 0x7ffff7b42774
17 chameleon::ChameleonStyle::drawControl(QStyle::ControlElement, QStyleOption const *, QPainter *, QWidget const *) const 0x7ffff145260e
18 chameleon::ChameleonStyle::drawControl(QStyle::ControlElement, QStyleOption const *, QPainter *, QWidget const *) const 0x7ffff1452351
19 QPushButton::paintEvent(QPaintEvent *) 0x7ffff7c5763e
20 QWidget::event(QEvent *) 0x7ffff7b134f8
:[https.//i.stack.imgur.com/3VAaI:png][https.//i.stack.imgur.com/3VAaI.png]
其他发现:使用 Qt5.14 和使用 Qt5.9 有不同的 depands QT5.14.2
linux-vdso.so.1 (0x00007ffcdcda8000)
libQt5Widgets.so.5 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libQt5Widgets.so.5 (0x00007f950c550000)
libQt5Gui.so.5 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libQt5Gui.so.5 (0x00007f950bc36000)
libQt5Core.so.5 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libQt5Core.so.5 (0x00007f950b45b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f950b23c000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f950aeb3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f950ab15000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f950a8fd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f950a50c000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f950a280000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f950a063000)
libicui18n.so.56 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libicui18n.so.56 (0x00007f9509bca000)
libicuuc.so.56 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libicuuc.so.56 (0x00007f9509812000)
libicudata.so.56 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libicudata.so.56 (0x00007f9507e2f000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9507c2b000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f9507a29000)
libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f9507712000)
/lib64/ld-linux-x86-64.so.2 (0x00007f950f3e6000)
libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f95074e1000)
libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f950722b000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9506fb9000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f9506c81000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f9506a59000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f9506855000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f950664f000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f950643a000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f9506232000)
QT5.9.8
linux-vdso.so.1 (0x00007ffc6ddf8000)
libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007f95c72f2000)
libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f95c6b89000)
libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f95c643e000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f95c61b2000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f95c5f93000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f95c5c0a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f95c586c000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f95c5654000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f95c5263000)
libpng16.so.16 => /usr/lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f95c5031000)
libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f95c4d93000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f95c4b76000)
libicui18n.so.60 => /usr/lib/x86_64-linux-gnu/libicui18n.so.60 (0x00007f95c46d5000)
libicuuc.so.60 => /usr/lib/x86_64-linux-gnu/libicuuc.so.60 (0x00007f95c431d000)
libdouble-conversion.so.1 => /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1 (0x00007f95c410c000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f95c3f08000)
libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f95c3bf1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f95c7b39000)
libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f95c39c0000)
libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f95c370a000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f95c3456000)
libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f95c3229000)
libicudata.so.60 => /usr/lib/x86_64-linux-gnu/libicudata.so.60 (0x00007f95c1680000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f95c140e000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f95c10d6000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f95c0eae000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f95c0caa000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f95c0aa4000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f95c088f000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f95c0687000)
鉴于堆栈跟踪的这一部分:
hb_qt_face_get_for_engine(QFontEngine *)
QFontEngine::harfbuzzFace() const
您可能会看到 mupdf 中包含的 harfbuzz 版本与 qt 正在使用的版本之间的冲突。 可能有一些 API 更改,并且 qt 正在调用 mupdf 提供的版本,该版本具有与预期不同的 API。
有许多可能的解决方案。 您可以将 mupdf(以及它的所有第三方依赖项,如 harfbuzz)构建到 a.so 中,并确保 harfbuzz 符号在 that.so 外部不可见,这意味着 qt 看不到 harfbuzz 的 mupdf 版本,因此将调用打算的一个。 另一种解决方案是尝试针对 harfbuzz 的系统版本而不是 mupdf 中的系统版本构建 mupdf,但如果 API 已更改,则需要更改 mupdf 的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.