2

CMake を使用して MacOS で dylib をコンパイルしようとしています。私のライブラリは他のいくつかのライブラリに動的にリンクされており、それらを私のライブラリと一緒に出荷したいと考えています。このために、ライブラリをロードするときに、依存ライブラリがその場所に関係なく同じフォルダーからロードされるようにする必要があります。rpath と関係があると思いますが、私は専門家ではありません。CMake を使用してこれを実現する方法を提案できますか? (-Wl、-rpathなどを介していくつかのリンカーオプションを提供する必要があると思います

前もって感謝します!

4

2 に答える 2

1

バイナリ (実行可能ファイルおよびその他のライブラリ) と同じディレクトリから共有ライブラリをロードするために、CMake スクリプトで実行したことは次のとおりです。

SET(CMAKE_BUILD_WITH_INSTALL_RPATH true)
SET(CMAKE_INSTALL_RPATH "$ORIGIN/")

(CMake 3.0+でテスト済み)

仕組み (私の理解): 2 行目は、バイナリ検索フォルダーに $ORIGIN 特殊文字列を追加するように CMake に指示します (この特殊な $ORIGIN 文字列は、実行時に OS によって、実行中のバイナリを含むフォルダーに「置き換えられます」 . したがって、この文字列を含むバイナリの隣にある必要なライブラリが正しく検出されます)。

ただし、CMake でこの変数を設定すると、インストール時のバイナリ (たとえば、make installでデプロイされたもの) にのみ影響します。CMake は、ビルド段階で作成されたバイナリの検索パスを変更しませんが、インストール時にのみ変更します。

私は CMake のインストール機能を使用しておらず、自由に再配置可能なフォルダーにアプリケーションを提供したいだけなので、最初の呼び出しを使用して、ビルド時にインストール時の検索パスを使用するように CMake に指示します。

したがって、これら 2 つの呼び出しで、CMake で生成された makefile でmake (または XCode でビルド) を呼び出すと、検索フォルダーが $ORIGIN に正しく設定されたバイナリが作成されます。

他のターゲットを定義する前にこれを行ってください。また、set_target_property を BUILD_WITH_INSTALL_RPATH および INSTALL_RPATH プロパティとともに使用して、個々のターゲットのこれらの設定をカスタマイズすることもできます。

これは Linux でしかテストしていませんが、MacOS X が同じように動作する場合は問題ありません。

お役に立てれば

ベンジャミン

于 2015-12-01T08:04:15.957 に答える
1

Linux の ${ORIGIN} トリックは機能しません。macOS では、ライブラリの依存関係はデフォルトで絶対パス ( otool -L mylib.dylib) として指定されます。

相対パス (例: 同じフォルダー) を使用するには、メイン ライブラリ内の依存ライブラリのインストール名を@rpath/other.dylibinstall_name_tool -change ...のような名前に変更し、実行可能ファイル (dylib) に正しい rpath を指定するのが適切な方法だと思います。またはあなたの場合は@executable_path/other.dylibだけです。

CMake に関しては、CMake BundleUtilitiesモジュールを使用してこれを自動的に修正することに成功しました。試してみる価値があるかもしれません。

于 2016-07-07T09:20:25.497 に答える