我希望这个问题不具体。我正在尝试为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"
答案 0 :(得分:4)
我遇到了同样的问题。以下作品:
确保vlfeat动态库中缺少符号“vl_sift_process_next_octave” - libvl.so - “nm libvl.so | grep vl_sift_process_next_octave”。如果不是这样,你应该重新制作vlfeat。
如果确实如此,请检查烦人的mex文件vl_sift.mex是否通过“readelf -d vl_sift.mex”正确引用libvl.so。在动态部分中出现libvl.so条目或重建mex文件,指定明确缺少,因此“mkoctfile --mex -lvl ...”。
现在剩下最后一步了。 “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