El Capitan、確認してください、DYLD_LIBRARY_PATH


9

私は通常のUnixツールセットを使用してアプリケーションを開発makeします。コンパイラ、、および共有ライブラリです。手順は伝統的に次のようなものです

  • ./configureを実行するマシンの機能のソースを調整します。
  • make、実際には共有ライブラリ、実行可能ファイルなどをコンパイルします。
  • make check、パッケージをインストールするにテストを実行し、
  • make install、パッケージが適切に動作する場合、最後にオプションで、
  • make installcheck、インストールが機能することを確認します。

の間make、共有ライブラリと実行可能ファイルは、最終的な形式でコンパイルされます。実行可能ファイルは、最終的な宛先で共有ライブラリへの依存関係でコンパイルされます(つまり、ライブラリには依存し/usr/local/libていませんが、まだビルドされています。木)。次にmake install、大まかにcp言って、ビルドツリーから最終的な場所にlibsと実行可能ファイルをインストールするためだけに使用します。

このmake checkフェーズでは、アンインストールされたプログラムを実行しています。共有ライブラリ、実行可能ファイル、補助ファイルは、ビルドツリーに残っています。テストを実行するには、いくつかのカスタム環境変数(たとえば、補助データファイルが/usr/local/shareソースツリーではなくソースツリーにあることをプログラムに通知する)といくつかのシステム環境変数を設定して、共有ライブラリローダーに表示するように通知する必要があります。共有ライブラリ用。従来のUnicesの環境変数はLD_LIBRARY_PATHOS XではそれですDYLD_LIBRARY_PATH。これは(何十年も)働いてきました。

しかし今、エルキャピタンはこれを破った。

$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$

現在、SIPが有効になっている場合DYLD_*、プロセスからその子には何もエクスポートされません。

だから私の質問です:インストールされていないプログラムをどのように実行できますか?従来のUnixシーケンスを実行できるようにするための手順は何./configure && make && make checkですか?

してください、何の答えは次のような「実行しないmake install第一」。それはポイントではありません。私は開発者であり、「make check」の実行(より一般的には、インストールされていないバージョンのプログラムの実行)は非常に頻繁に行います。ダミーの場所に設置するだけでも時間がかかります。私は何か効果的な、必要効率的。また、SIPを無効にしても、実行したい私のパッケージのユーザーの問題は修正されませんmake check


DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.610.11で古いAPU(古いライブラリを使用)を実行するために使用できます(変数がに表示されない場合でもenv)。奇妙です(しかし動作します)。
ノーヒルサイド

回答:


6

DYLD_ *は「保護された」バイナリの場合にのみ取り除かれているようです(正確にはどういう意味かわかりませんが、/ binと/ usr / binの最初の部分は明らかに何でもかまいません)。ただし、/ usr / bin / envをコピーした場合他のどこかに、それはそのDYLD_ *のものを維持するようになります:

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

makeは常に/ bin / shを介してコマンドを実行するので、makefileで「危険な」変数を設定してコマンドに影響を与えることはできませんが、テストをシェルスクリプトに移動して、環境変数をスクリプトを作成し、makeからスクリプトを呼び出します。ただし、テストシェルスクリプトに依存している場合(またはテストされたものシェルスクリプトの場合)は、/ bin / shが呼び出されて変数が再び失われるため、明らかに役に立ちません。 。


どうもありがとう!これcp /bin/shで、実際のシェルの代わりにそのシェルを使用できます。シンボリックリンクは機能せず、ハードリンクは「許可されていない操作」であるため、私はと一緒に暮らす必要があると思いcpます。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.