3

これを解決するためのヒントを教えてもらえますか?

「Kinect Matlab」 (Mac OS 10.7)をコンパイルしようとしています。コンパイル スクリプトには次の行があります。

mex('-v','-L/usr/lib/','-lOpenNI',[...],Filename);

これは mex によって実行される完全なコマンドです: (1)

gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2011a.app/extern/lib/maci64/mexFunction.map -o  "mxNiChangeDepthViewPoint.mexmaci64"  mxNiChangeDepthViewPoint.o  -L/usr/lib/ -lOpenNI -L/Applications/MATLAB_R2011a.app/bin/maci64 -lmx -lmex -lmat -lstdc++

次に、次のエラーが表示されます。

ld: library not found for -lOpenNI
collect2: ld returned 1 exit status

    mex: link of ' "mxNiChangeDepthViewPoint.mexmaci64"' failed.

にファイルがあることは間違いありません/usr/lib/libOpenNI.dylib

ldこのエラーをスローする原因は何ですか?

私が試したこと:

  • libOpenNI.sojmlopezが提案したように、というシンボリックリンクを作成しようとしましたが、効果はありません。
  • それlibOpenNIは 32 ビット ライブラリでありld、その理由で表示されない可能性がありますか? または、エラーは異なりますか?
  • 上記の点について、ビルドは「ユニバーサル x86/x64」と書いてあります。

環境変数:

matlab ターミナルから次のコマンドを使用して、ライブラリを環境変数に追加しようとしました。無効。

setenv('DYLD_LIBRARY_PATH', [getenv('DYLD_LIBRARY_PATH') ':/usr/lib/']);

バッシュの場合:

https://serverfault.com/questions/54736/how-to-check-if-a-library-is-installedで提案されているように gcc を呼び出すだけで問題はありません。

$ gcc -lOpenNi
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o

ただし、最初に g++ を実行すると、(1)のように gcc が実行され、以前と同じエラーが発生します。(ライブラリが見つかりません)。なぜgccはライブラリを見つけることができますが、matlabが(1)のものを追加すると、混乱しますか?

したがって、上記の内容に関連して、別のエラーが発生するまで、 (1)からすべての引数を削除し始めました。を削除しました-Wl,-syslibroot。つまり、-syslibroot が に渡されなくなりましldた。これで修正されたようです。-syslibrootライブラリ検索ディレクトリを台無しにすることも同様です! 次に、この引数をmex()呼び出しから削除する方法を見つけます。

4

3 に答える 3

2

に追加しようとしましOpenNiLIBRARY_PATHか?

export LIBRARY_PATH=$LIBRARY_PATH:/YOUR-PATH/OpenNi

于 2011-11-25T05:11:00.650 に答える
1

最初のオプション:libOpenNiがコンパイルしているバイナリと同じアーキテクチャでない場合、コンパイラスイート全体がそれを無視する可能性があります。とにかくそれをリンクさせることができた場合、おそらくクラッシュするでしょう。ネイティブ64ビットライブラリを見つけて、それに対してリンクします。

2番目のオプション:これについて100%確信はありませんが、いくつかの難解なLinuxプロジェクトでリンクを試みたときはいつでも、で指定されたパスにある.aオブジェクトアーカイブから始めます-L。リンクされている場合は、x86_64を追加-fPIC -sharedして、共有ライブラリに対してコンパイルできるようにします。これがOSXで機能するかどうかはわかりません。そのプラットフォームでの開発は、まだ行ったことがありません。

于 2011-11-22T07:44:26.733 に答える
0

ブーム!できます!

さて、ここにあります:

-Wl,-syslibrootgcc 呼び出しのオプション(1)はリンカーにオプションを送信-syslibrootし、ライブラリ検索パスの先頭に追加されます (リンク時に syslibroot でルート sdk ディレクトリを指定できないため、そうすべきではありませんが) 。

したがって、これを削除-syslibrootすると問題を解決できます。これは で実行できますmexopts.sh。デフォルトの場所から matlab のバージョンをコピーする:

cp /Applications/MATLAB_R2011a.app/bin/mexopts.sh ~/.matlab/R2011a/

そして、この行を変更します (201):

LDFLAGS="-Wl,-twolevel_namespace -undefined error -arch $ARCHS -Wl,-syslibroot,$SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"

引数を削除し-Wl,-syslibroot,$SDKROOTます。

-L/usr/libさらに、 mex の呼び出しから引数を削除して、次のように簡単にすることもできます。

 mex('-v','-lOpenNI',['-I' OpenNiPathInclude],Filename);
于 2011-11-28T10:48:06.263 に答える