Octave 倍频程找不到fltk XGetUtf8FontAndGlyph符号

Octave 倍频程找不到fltk XGetUtf8FontAndGlyph符号,octave,fltk,Octave,Fltk,倍频程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: cal

倍频程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库):

和(倍频程)

如果我用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-D/usr/lib64/fltk/libfltk_gl.so.1.3
uxCreateColorMap
U XGetUtf8FontAndGlyph
w_ITM_注销可克隆
w_ITM_寄存器克隆表
w_Jv_注册类别
U_Z10fl_测量Kcris1_i
000000000000 E170 T_Z10gl_descentv
000000000000 E590 T_Z10gl_测量值kCRIS1_
... 
根据nm手册,U表示符号为全局(外部)但未知。我的问题是,这个未知的符号状态是否是从octave报告的错误的根源,这表明问题在于fltk是如何编译的,或者octave编译是否存在某种错误


编辑:通过启用Xft支持解决了问题:请参阅下面的评论,我再次感谢Andy的帮助。

XGetUtf8FontAndGlyph应该在libfltk.so.1.3中

nm -D /usr/lib/x86_64-linux-gnu/libfltk.so.1.3 |grep XGetU
00000000000c2fc0 T XGetUtf8FontAndGlyph
这很可能是fltk而不是GNU倍频程的配置标志的问题。先用默认设置试试

您可以使用OpenGL测试UTF8是否适合“立方体”测试。只需深入了解fltk源目录测试:

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

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

也有类似问题。尝试运行倍频程时出现以下错误(
未定义符号:_ZN18Fl_XFont_On_Demand5valueEv
):

命令
nm-D/usr/lib/libfltk\U gl.so.1.3
显示符号
\U ZN18Fl\U XFont\U On\U Demand5valueEv
未定义(使用
U
):


解决方案是将上述补丁文件应用于FLTK-1.3.3源目录中的一些文件,然后重新编译并重新安装FLTK。现在octave与FLTK一起工作没有任何问题。

非常感谢您的快速回答和见解,我将编译FLTK源代码并报告结果//rolfAndy-我确实使用默认配置编译了fltk源代码(即,仅使用
/configure
),并且成功地从多维数据集测试程序获得了实时输出,并且文本确实显示出来。来自plainjane配置的结果如下。但是,如果使用
/configure--enable gl--enable shared
,则生成的
/src/libfltk.so.1.3
库缺少任何导出的
XGetUtf8FontAndGlyph
符号;或者,使用原始帖子中描述的附加开关进行配置和制作,同时提供相同的多维数据集输出(带有字体),生成的库中也没有提到
XGetUtf8FontAndGlyph
符号。你知道你的
libfltk.so.1.3是如何编译的吗?谢谢——好的,问题是xft,或者说缺少它(xft在最初的配置中被禁用)。在configure中启用xft(
--启用xft
)删除了对查找XGetUtf8FontAndGlyph符号的依赖性。。。并且octave能够使用libfltk.so.1.3而没有错误:-)
nm -D /usr/lib/x86_64-linux-gnu/libfltk.so.1.3 |grep XGetU
00000000000c2fc0 T XGetUtf8FontAndGlyph
cd fltk-1.3.3/test
make cube && ./cube
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
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