3

C++ からコンパイルされたライブラリ ファイルに問題があるため、otoolコマンド ライン ユーティリティ (OSX 上) を使用して、リンク先のファイルを調べました。

これは出力です:

! otool -L pyopenvdb.so 
pyopenvdb.so:
    pyopenvdb.so (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/opt/tbb/lib/libtbb.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/local/lib/libHalf.11.dylib (compatibility version 12.0.0, current version 12.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/local/lib/libIlmImf-Imf_2_1.21.dylib (compatibility version 22.0.0, current version 22.0.0)
    /usr/local/lib/libjemalloc.1.dylib (compatibility version 0.0.0, current version 0.0.0)
    /System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.5)
    libboost_python.dylib (compatibility version 0.0.0, current version 0.0.0)
    libopenvdb.so.2.3.0 (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

リンクされているファイルのほとんどは、絶対パスで参照されます/usr/local/opt/tbb/lib/libtbb.dylib

ただし、ファイル名と同様に、相対パスのように見えるものによって参照されるものもありますlibboost_python.dylib

これは何を意味するのでしょうか?

パス上で最初に見つかったものに応じて、実行時に の異なるバージョンlibboost_python.dylibがリンクされる可能性があるということですか? それとも、これらの「相対」パスを検索する他の方法ですか?

4

1 に答える 1

3

これは問題ありません。つまり、絶対パスのないライブラリは、otool したもの (pyopenvdb.so) に対して相対的です。ただし、標準化する場合は、install_name_tool でパスを変更できます。あなたが言及した場合は、 -change 引数を使用してください。

Usage: install_name_tool [-change old new] ... [-rpath old new] ... [-add_rpath new] ... [-delete_rpath old] ... [-id name] input

例えば、install_name_tool pyopencdv.so -change libboost_python.dylib /usr/local/lib/libboost_python.dylib

出力の最初の行で、pyopenvdb.so も自身を参照していることに注意してください。もちろんこれは相対パスですが、install_name_tool を使用したい場合は、'-id' 引数を使用して絶対パスに変更することもできます

于 2015-07-12T11:32:38.997 に答える