我希望这个问题不是具体的。我正在编译用于八度音阶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"
谢谢你的回答。我在步骤3中苦苦挣扎。我的机器上没有root权限。所以我认为我不能使用'ldconfig'。我尝试使用'LD_LIBRARY_PATH'而没有成功。我现在使用'LD_PRELOAD'。现在我可以运行一些演示。你知道一种让它更加永久的方法吗?也许可以添加到.bashrc或其他东西? – sietschie
只是为了记录:第一步不是我的问题。但似乎2.的症状是由于'mkoctfile'不能将'LDFLAGS'传递给链接器而引起的。我通过更改Makefile来修复它,以便将标志直接传递给'mkoctfile',然后将它们正确地传递给链接器。 – sietschie