2012-06-29 56 views
2

我希望这个问题不是具体的。我正在编译用于八度音阶3.6.2的vlfeat库。编译vlfeat MEX:未定义的符号

它编译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 

如果我使用倍频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" 

回答

4

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

  1. 确保缺少符号 “vl_sift_process_next_octave存在” 在vlfeat动态库 - libvl.so - 通过 “纳米libvl.so | grep的vl_sift_process_next_octave”。如果情况并非如此,你应该重新选择vlfeat。

  2. 如果是这样,请通过“readelf -d vl_sift.mex”正确检查令人讨厌的mex文件vl_sift.mex是否指向libvl.so。在动态部分出现libvl.so条目,或者重建mex文件,指定明确缺少“mkoctfile --mex -lvl ...”。

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

+0

谢谢你的回答。我在步骤3中苦苦挣扎。我的机器上没有root权限。所以我认为我不能使用'ldconfig'。我尝试使用'LD_LIBRARY_PATH'而没有成功。我现在使用'LD_PRELOAD'。现在我可以运行一些演示。你知道一种让它更加永久的方法吗?也许可以添加到.bashrc或其他东西? – sietschie

+0

只是为了记录:第一步不是我的问题。但似乎2.的症状是由于'mkoctfile'不能将'LDFLAGS'传递给链接器而引起的。我通过更改Makefile来修复它,以便将标志直接传递给'mkoctfile',然后将它们正确地传递给链接器。 – sietschie

1

我也有同样的问题,采用倍频3.6.2和vlfeat 0.9.16。 经过octave.mak,发现OCTAVE_MEX_FLAGS是空的,并且从未使用过OCTAVE_MEX_LDFLAGS。所以,在章节八度-mex-all中,我尝试用OCTAVE_MEX_LDFLAGS更改OCTAVE_MEX_FLAGS。也就是说,我用:

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

然后,我让所有重建,现在工作。但我没有试图进一步调查为什么会这样。

希望这有助于

0

万一有人碰到这个线程在未来,在八度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 
相关问题