以八度为单位编译vlfeat mex:未定义的符号

时间:2012-06-29 07:33:47

标签: octave mex vlfeat

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

它编译没有错误的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"

3 个答案:

答案 0 :(得分:4)

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

  1. 确保vlfeat动态库中缺少符号“vl_sift_process_next_octave” - libvl.so - “nm libvl.so | grep vl_sift_process_next_octave”。如果不是这样,你应该重新制作vlfeat。

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

  3. 现在剩下最后一步了。 “libvl.so”对八度音程应该是可见的。使用ldconfig将libvl.so添加到so cache中,并通过“ldconfig -p | grep libvl.so”测试它是否存在于缓存中。这就是全部。

答案 1 :(得分:1)

我也有同样的问题,使用Octave 3.6.2和vlfeat 0.9.16。 检查octave.mak并注意到OCTAVE_MEX_FLAGS为空并且从未使用过OCTAVE_MEX_LDFLAGS。因此,在octave-mex-all部分中,我尝试使用OCTAVE_MEX_LDFLAGS更改OCTAVE_MEX_FLAGS。也就是说,我用过:

 $(MKOCTFILE) \
       --mex $(OCTAVE_MEX_LDFLAGS) \
       "$(<)" --output "$(@)"
@rm -f $(<:.c=.o)

然后我用make all重建,事情现在起作用了。但我没有尝试进一步调查为什么会这样。

希望这有帮助

答案 2 :(得分:1)

如果将来有人碰到这个帖子,问题仍然存在于Octave 4.0.0中。在按照此处的建议编译库之前更改make / octave.mak解决了我的问题:https://github.com/vlfeat/vlfeat/issues/18。应该设置OCTAVE_MEX_LDFLAGS而不是OCTAVE_MEX_FLAGS。

# 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