我希望这个问题不是很具体。我正在尝试编译 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 文件加载时不会出现错误。 (但后来由于matlab函数在这个版本的octave中还没有实现,所以还有其他错误。)
我不知道如何开始调查这个问题。 出现此类错误消息的原因可能是什么? 或者我可以做些什么来进一步调查这个问题?
更新: 我做了更多的研究。但是我对链接和编译的过程不是很熟悉。
使用 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”应该对 Octave 可见。使用ldconfig将libvl.so添加到so缓存中,通过“ldconfig -p | grep libvl.so”测试缓存中是否存在。就这些。
关于octave - 在 Octave : undefined symbol 中编译 vlfeat mex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11257836/