Octave 在八度音程中编译vlfeat mex:未定义符号

Octave 在八度音程中编译vlfeat mex:未定义符号,octave,mex,vlfeat,Octave,Mex,Vlfeat,我希望这个问题不要太具体。我正在尝试编译octave 3.6.2的库 它编译mex文件时没有错误。但如果我执行 vl_setup vl_demo 我明白了 error: vl_demo_sift_basic: vl_sift.mex: failed to load: vl_sift.mex: undefined symbol: vl_sift_process_next_octave 如果改用octave 3.4.3,则加载mex文件时不会出错。(但由于在这个版本的倍频程中还没有实现matla

我希望这个问题不要太具体。我正在尝试编译octave 3.6.2的库

它编译mex文件时没有错误。但如果我执行

vl_setup
vl_demo
我明白了

error: vl_demo_sift_basic: vl_sift.mex: failed to load: vl_sift.mex: undefined symbol: vl_sift_process_next_octave
如果改用octave 3.4.3,则加载mex文件时不会出错。(但由于在这个版本的倍频程中还没有实现matlab函数,因此还有其他错误。)

我不知道如何开始调查这个问题。 出现这种错误消息的原因可能是什么? 或者我可以做些什么来进一步调查这个问题

更新: 我做了更多的研究。但我不太熟悉链接和编译的过程

使用
ldd
我可以看到vlfeat共享库没有显示在列表中。 使用
nm
未定义的符号显示为“U”。 但我认为图书馆应该链接起来。问题在于所有的mex文件。下面是一个如何编译文件的示例。据我所见,该库链接到mex文件

CFLAGS="-std=c99 -Wall -Wextra -Wno-unused-function -Wno-long-long -Wno-variadic-macros    -DNDEBUG -O3  -I./toolbox" \
CXXFLAGS="" \
LDFLAGS=" -Wl,--rpath,\$ORIGIN/ -Wl,--as-needed -lpthread -lm -Lbin/glnxa64 -lvl" \
 mkoctfile \
       --mex  \
       "./toolbox/misc/vl_version.c" --output "toolbox/mex/octave/vl_version.mex"

我遇到了同样的问题。以下工作:

  • 通过“nm libvl.so | grep vl_sift_process_next_octave”确保vlfeat动态库libvl.so中缺少符号“vl_sift_process_next_octave存在”。如果不是这样的话,你应该反驳vlfeat

  • 如果是,请检查恼人的mex文件vl_sift.mex是否通过“readelf-d vl_sift.mex”正确引用libvl.so。在动态部分或重建mex文件中出现libvl.so条目,通过“mkoctfile--mex-lvl…”指定显式缺少so

  • 现在剩下最后一步了。“libvl.so”应该对倍频程可见。使用ldconfig将libvl.so添加到so缓存中,并通过“ldconfig-p | grep libvl.so”测试缓存中是否存在libvl.so。仅此而已


  • 我也有同样的问题,使用倍频程3.6.2和vlfeat 0.9.16。 检查octave.mak并注意到octave_MEX_标志为空,并且octave_MEX_LDFLAGS从未使用过。所以,在octave mex all一节中,我尝试用octave mex LDFLAGS更改octave mex标志。也就是说,我用了:

     $(MKOCTFILE) \
           --mex $(OCTAVE_MEX_LDFLAGS) \
           "$(<)" --output "$(@)"
    @rm -f $(<:.c=.o)
    
    $(MKOCTFILE)\
    --mex$(八度音阶mex)\
    
    “$(如果将来有人碰到此线程,问题仍然存在于Octave 4.0.0中。按照此处的建议在编译库之前更改make/Octave.mak解决了我的问题:。应设置Octave_MEX_标志,而不是Octave_MEX_标志

    # Linux on 32 bit processor
    ifeq ($(ARCH),glnx86)
    OCTAVE_MEX_LDFLAGS += -Wl,--rpath,\\\$$ORIGIN/
    endif
    
    # Linux on 64 bit processorm
    ifeq ($(ARCH),glnxa64)
    OCTAVE_MEX_LDFLAGS += -Wl,--rpath,\\\$$ORIGIN/
    endif
    

    谢谢你的回答。我在第3步有点困难。我的机器上没有root访问权限。所以我想我不能使用
    ldconfig
    。我尝试使用
    LD\u LIBRARY\u PATH
    ,但没有成功。我现在正在使用
    LD\u PRELOAD
    。现在我可以运行一些演示。你知道一种让它更持久的方法吗?也许是这样可以添加到.bashrc或其他东西的方法?只是为了记录:步骤1不是我的问题。但2.的症状似乎是由以下事实引起的:
    mkoctfile
    没有将
    LDFLAGS
    传递到链接器。我通过更改Makefile来修复它,以便将标志直接传递到
    mkoctfile,然后将它们正确地传递给链接器。