Octave 在八度音程中编译vlfeat mex:未定义符号
我希望这个问题不要太具体。我正在尝试编译octave 3.6.2的库 它编译mex文件时没有错误。但如果我执行Octave 在八度音程中编译vlfeat mex:未定义符号,octave,mex,vlfeat,Octave,Mex,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文件时不会出错。(但由于在这个版本的倍频程中还没有实现matla
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.6.2和vlfeat 0.9.16。 检查octave.mak并注意到octave_MEX_标志为空,并且octave_MEX_LDFLAGS从未使用过。所以,在octave mex all一节中,我尝试用octave mex LDFLAGS更改octave mex标志。也就是说,我用了:
$(MKOCTFILE) \
--mex $(OCTAVE_MEX_LDFLAGS) \
"$(<)" --output "$(@)"
@rm -f $(<:.c=.o)
$(MKOCTFILE)\
--mex$(八度音阶mex)\
“$(如果将来有人碰到此线程,问题仍然存在于Octave 4.0.0中。按照此处的建议在编译库之前更改make/Octave.mak解决了我的问题:。应设置Octave_MEX_标志,而不是Octave_MEX_标志
# 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
谢谢你的回答。我在第3步有点困难。我的机器上没有root访问权限。所以我想我不能使用ldconfig
。我尝试使用LD\u LIBRARY\u PATH
,但没有成功。我现在正在使用LD\u PRELOAD
。现在我可以运行一些演示。你知道一种让它更持久的方法吗?也许是这样可以添加到.bashrc或其他东西的方法?只是为了记录:步骤1不是我的问题。但2.的症状似乎是由以下事实引起的:mkoctfile
没有将LDFLAGS
传递到链接器。我通过更改Makefile来修复它,以便将标志直接传递到mkoctfile代码>,然后将它们正确地传递给链接器。