2012-06-29 75 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 
相關問題