2

I hope this question is not to specific. I am trying to compile the vlfeat library for octave 3.6.2.

It compiles the mex-files without errors. But if I execute

vl_setup
vl_demo

i get

error: vl_demo_sift_basic: vl_sift.mex: failed to load: vl_sift.mex: undefined symbol: vl_sift_process_next_octave

If I use octave 3.4.3 instead, the mex file loads without errors. (But there are other errors later because of matlab functions which are not implemented yet in this version of octave.)

I have no idea how I could start investigating this problem. What could be the reason for such an error message? Or what can I do to further investigate this problem?

Update: I did some more research. But I am not very familiar with the process of linking and compiling.

を使用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

3 に答える 3

4

私は同じ問題に遭遇しました。次の作品:

  1. 「nmlibvl.so|grep vl_sift_process_next_octave」によって、vlfeatダイナミックライブラリ--libvl.so--に欠落しているシンボル「vl_sift_process_next_octave」が存在することを確認してください。そうでない場合は、rebuldvlfeatを使用する必要があります。

  2. もしそうなら、迷惑なmexファイルvl_sift.mexが「readelf-dvl_sift.mex」によってlibvl.soを正しく参照していることを確認してください。動的セクションにlibvl.soエントリが表示されるか、「mkoctfile --mex-lvl...」によって明示的に欠落していることを指定してmexファイルを再構築します。

  3. これで最後のステップが残ります。「libvl.so」はオクターブに見えるはずです。ldconfigを使用してlibvl.soをsoキャッシュに追加し、「ldconfig -p|greplibvl.so」によってキャッシュに存在するかどうかをテストします。以上です。

于 2013-02-19T03:16:39.973 に答える
1

Octave3.6.2とvlfeat0.9.16を使用しても、同じ問題が発生しました。Octave.makをチェックし、OCTAVE_MEX_FLAGSが空であり、OCTAVE_MEX_LDFLAGSが使用されていないことに気づきました。そのため、octave-mex-allセクションで、OCTAVE_MEX_FLAGSをOCTAVE_MEX_LDFLAGSに変更してみました。つまり、私は使用しました:

 $(MKOCTFILE) \
       --mex $(OCTAVE_MEX_LDFLAGS) \
       "$(<)" --output "$(@)"
@rm -f $(<:.c=.o)

次に、make allを使用して再構築しましたが、現在は機能しています。しかし、私はそれがなぜそうなのかをさらに調査しようとはしませんでした。

お役に立てれば

于 2013-02-24T21:33:54.643 に答える
1

将来誰かがこのスレッドに出くわした場合に備えて、問題は Octave 4.0.0 でも解決されません。ここで提案されているように、ライブラリをコンパイルする前に make/octave.mak を変更すると、問題が解決しました: https://github.com/vlfeat/vlfeat/issues/18。OCTAVE_MEX_FLAGS の代わりに、OCTAVE_MEX_LDFLAGS を設定する必要があります。

# 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
于 2016-10-28T19:56:05.817 に答える