ldのマニュアルページ(および拡張機能によるリンクに使用されるgcc)によれば、コマンドラインに-Lオプションが指定されている場合は、-lで指定されたすべてのライブラリに適用され、デフォルトの検索場所よりも優先されます。しかし、それは私のリンクステップでは機能していません。私は、コマンドラインでこれを持っている:gcc/ldが-L設定を無視するのはなぜですか?
-L /ユーザー/ ME/MYLIB -lpcre -lz
及び/ユーザー/ ME/MYLIBはlibpcre.soのと
libz.so(コピー)を含んでいますこれらのライブラリは、システム上の他の場所に存在します(必ずしも同じバージョンである必要はありません)。また、Linux上ではldd、Macではotoolで表示されます。これらの場所のいくつかはLD_LIBRARY_PATHにあります(これは私が実行しているビルド環境では制御できません)、どうにかそれらの場所が私の明示的な設定である-Lより優先されているようです。
これはリンクステップの問題であり、実行時の問題ではありません。実行時にライブラリの場所に影響を与える/上書きする方法については、Webに多くの情報があります。私が-Lでやろうとしていることは、完全に指定されたセットアップを作成することです。私はMacOS上でinstall_name_toolを使って問題を解決できることを知っているが、なぜ-Lがそれが主張することをしていないのかを理解したい。
gcc -Wl、-vを使って学んだことの1つは、gccがすべてのLD_LIBRARY_PATHディレクトリをldに転送するように見えるということです。しかし、私は明示的にリストされているものの後に置いています。そして、man ldは、それらがライン上に表示されるように検索されたと言います。
リンクステップ(またはOS Xのバージョンに合わせて 'dtruss''d、&c。)を' truss'して、実際に使用されている検索順序を検査しましたか(真に他の場所最初に、あなたの意図した場所を探して、結果を生き残れないものとして捨てる)? –
また、あなたのタイトルが示唆するようにGNU 'ld'ですか、それとも実際にMacOSでデフォルトになっているLLVMの実装ですか? (同様に、 'gcc'は実際にはデフォルトのコンパイラではありません。' gcc'コマンドは、デフォルトのLLVMラッパーです。 –
私はまだtrussやLD_DEBUGのようなツールに頼っていません。なぜなら、リンクコマンドを満たすためにldによってロードされたライブラリ自体とツール自体によってロードされるライブラリに関する情報がどのように区別されるのかはわかりません(ld pcreを内部的に使用しないでください)。 – user2953466