【问题标题】:octave cannot find fltk XGetUtf8FontAndGlyph symbol八度找不到 fltk XGetUtf8FontAndGlyph 符号
【发布时间】:2015-03-12 13:04:26
【问题描述】:

octave 3.8.2 在加载时会产生此错误:

error: /usr/lib64/octave/3.8.2/oct/x86_64-pc-linux-gnu/PKG_ADD: /usr/lib64/octave/3.8.2/oct/x86_64-pc-linux-gnu/__init_fltk__.oct: failed to load: /usr/lib64/fltk/libfltk_gl.so.1.3: undefined symbol: XGetUtf8FontAndGlyph
error: called from:
error:   /usr/lib64/octave/3.8.2/oct/x86_64-pc-linux-gnu/PKG_ADD at line 6, column 1
GNU Octave, version 3.8.2

我得到以下关于图形库配置的信息

octave:1> octave_config_info().GRAPHICS_LIBS
ans = -L/usr/lib64/fltk -Wl,-rpath,/usr/lib64/fltk -Wl,-O1 -Wl,--sort-common -Wl,--as-needed -lfltk_gl -lGLU -lGL -lfltk -lXcursor -lXfixes -lXext -ldl -lm -lX11

虽然最初显然没有加载任何图形工具包,

octave:2> available_graphics_toolkits
ans = {}(1x0)

我可以随后注册,

octave:3> register_graphics_toolkit("gnuplot")
octave:4> available_graphics_toolkits
ans = 
{
  [1,1] = gnuplot
}
octave:5> register_graphics_toolkit("fltk")
octave:6> available_graphics_toolkits
ans = 
{
  [1,1] = fltk
  [1,2] = gnuplot
}

但尝试加载 fltk 会产生与初始警告一致的错误

octave:7> graphics_toolkit("fltk")
error: feval: /usr/lib64/octave/3.8.2/oct/x86_64-pc-linux-gnu/__init_fltk__.oct: failed to load: /usr/lib64/fltk/libfltk_gl.so.1.3: undefined symbol: XGetUtf8FontAndGlyph
error: called from:
error:   /usr/share/octave/3.8.2/m/plot/util/graphics_toolkit.m at line 74, column 5

当然,尝试绘制任何东西也会失败,

octave:8> plot(1:10)
error: feval: /usr/lib64/octave/3.8.2/oct/x86_64-pc-linux-gnu/__init_fltk__.oct: failed to     load: /usr/lib64/fltk/libfltk_gl.so.1.3: undefined symbol: XGetUtf8FontAndGlyph
error: called from:
error:   /usr/share/octave/3.8.2/m/plot/util/graphics_toolkit.m at line 74, column 5
error: failed to load fltk graphics toolkit
error: base_graphics_toolkit::initialize: invalid graphics toolkit
error:   /usr/share/octave/3.8.2/m/plot/util/figure.m at line 94, column 9
error:   /usr/share/octave/3.8.2/m/plot/util/gcf.m at line 63, column 9
error:   /usr/share/octave/3.8.2/m/plot/util/newplot.m at line 113, column 8
error:   /usr/share/octave/3.8.2/m/plot/draw/plot.m at line 219, column 9

octave 和 fltk 都是在 gentoo 下从源代码编译的:

x11-libs/fltk-1.3.3-r2:1  USE="opengl -cairo -debug -doc -examples -games -pdf -static-libs -threads -xft -xinerama"
sci-mathematics/octave-3.8.2:0/3.8.2  USE="X doc glpk gnuplot gui imagemagick opengl qhull qrupdate readline sparse zlib -curl -fftw -hdf5 -java -jit -postscript -static-libs"

导致配置开关(对于 fltk 库):

./configure --prefix=/usr --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --includedir=/usr/include/fltk --libdir=/usr/lib64/fltk --docdir=/usr/share/doc/fltk-1.3.3-r2/html --enable-largefile --enable-shared --enable-xdbe --disable-localjpeg --disable-localpng --disable-localzlib --disable-debug --disable-cairo --enable-gl --disable-threads --disable-xft --disable-xinerama

和(八度)

./configure --prefix=/usr --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --libdir=/usr/lib64 --disable-silent-rules --disable-dependency-tracking --docdir=/usr/share/doc/octave-3.8.2 --enable-shared --disable-static --localstatedir=/var/state/octave --with-blas=-L/usr/lib64/blas/reference -lblas   --with-lapack=-llapack -L/usr/lib64/blas/reference -lblas   --enable-docs --disable-java --enable-gui --disable-jit --enable-readline --without-curl --without-fftw3 --without-fftw3f --disable-fftw-threads --with-glpk --without-hdf5 --with-opengl --with-qhull --with-qrupdate --with-arpack --with-umfpack --with-colamd --with-ccolamd --with-cholmod --with-cxsparse --with-x --with-z --with-magick=GraphicsMagick

如果我用 nm 检查 libfltk_gl.so.1.3,我看到导出了以下符号:

$ nm -D /usr/lib64/fltk/libfltk_gl.so.1.3
                 U XCreateColormap
                 U XGetUtf8FontAndGlyph
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses
                 U _Z10fl_measurePKcRiS1_i
000000000000e170 T _Z10gl_descentv
000000000000e590 T _Z10gl_measurePKcRiS1_
... <snip>

根据 nm 手册,U 表示该符号是全局(外部)但未知的。我的问题是这个未知的符号状态是否是从八度报告的错误的根源,这表明问题在于fltk是如何编译的,或者八度编译是否存在某种错误。

编辑:已通过启用 Xft 支持解决:请参阅下面的 cmets,再次感谢 Andy 的帮助。

【问题讨论】:

    标签: octave fltk


    【解决方案1】:

    XGetUtf8FontAndGlyph 应该在 libfltk.so.1.3 中。

    nm -D /usr/lib/x86_64-linux-gnu/libfltk.so.1.3 |grep XGetU
    00000000000c2fc0 T XGetUtf8FontAndGlyph
    

    这很可能是您为 fltk 而不是 GNU Octave 配置标志的问题。先用默认设置试试吧。

    您可以通过“立方体”测试来测试 OpenGL 的 UTF8 内容是否正常。只需深入 fltk-source 目录测试:

    cd fltk-1.3.3/test
    make cube && ./cube
    

    GL 窗口左下角的文字是否显示?

    【讨论】:

    • 非常感谢您的快速回答和洞察力,我将编译 fltk 源并报告结果... //rolf
    • Andy- 我确实使用默认配置编译了 fltk 源代码(即,仅使用 ./configure),并且成功地从多维数据集测试程序获取实时输出,并且文本确实出现了.
    • plainjane 配置的结果是here。但是,如果我使用./configure --enable-gl --enable-shared 进行配置,则生成的./src/libfltk.so.1.3 库缺少任何导出的XGetUtf8FontAndGlyph 符号;或者,使用原始帖子中描述的附加开关进行配置和制作,同时提供相同的立方体输出(带字体),生成的库也缺少 any 提及XGetUtf8FontAndGlyph 符号。你碰巧知道你的libfltk.so.1.3 是如何编译的吗?谢谢--
    • 好的,问题出在 xft,或者更确切地说是缺少它(xft 在原始配置中被禁用)。在配置中启用 xft (--enable-xft) 消除了对查找 XGetUtf8FontAndGlyph 符号的依赖...并且 octave 能够无错误地使用 libfltk.so.1.3 :-)
    【解决方案2】:

    遇到了类似的问题。尝试运行 octave (undefined symbol: _ZN18Fl_XFont_On_Demand5valueEv) 时出现以下错误:

    bash-4.3$ octave
    error: /usr/local/lib/octave/4.0.2/oct/i686-pc-linux-gnu/PKG_ADD: /usr/local/lib/octave/4.0.2/oct/i686-pc-linux-gnu/__init_fltk__.oct: failed to load: /usr/lib/libfltk_gl.so.1.3: undefined symbol: _ZN18Fl_XFont_On_Demand5valueEv
    error: called from
        /usr/local/lib/octave/4.0.2/oct/i686-pc-linux-gnu/PKG_ADD at line 3 column 1
    

    命令nm -D /usr/lib/libfltk_gl.so.1.3 显示符号_ZN18Fl_XFont_On_Demand5valueEv 未定义(带有U):

    0000a3d4 T _ZN14Fl_Glut_WindowD1Ev
    0000a3d4 T _ZN14Fl_Glut_WindowD2Ev
             U _ZN18Fl_Font_DescriptorD1Ev
             U _ZN18Fl_Graphics_Driver11clip_regionEP8_XRegion
             U _ZN18Fl_XFont_On_Demand5valueEv
    

    解决的办法是把here提到的补丁文件应用到FLTK-1.3.3源码目录下的一些文件中,然后重新编译并重新安装FLTK。现在 octave 可以毫无问题地与 FLTK 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      相关资源
      最近更新 更多