我希望這個問題不是具體的。我正在編譯用於八度音階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