2016-10-03 7 views
1

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は、それらがライン上に表示されるように検索されたと言います。

+0

リンクステップ(またはOS Xのバージョンに合わせて 'dtruss''d、&c。)を' truss'して、実際に使用されている検索順序を検査しましたか(真に他の場所最初に、あなたの意図した場所を探して、結果を生き残れないものとして捨てる)? –

+0

また、あなたのタイトルが示唆するようにGNU 'ld'ですか、それとも実際にMacOSでデフォルトになっているLLVMの実装ですか? (同様に、 'gcc'は実際にはデフォルトのコンパイラではありません。' gcc'コマンドは、デフォルトのLLVMラッパーです。 –

+0

私はまだtrussやLD_DEBUGのようなツールに頼っていません。なぜなら、リンクコマンドを満たすためにldによってロードされたライブラリ自体とツール自体によってロードされるライブラリに関する情報がどのように区別されるのかはわかりません(ld pcreを内部的に使用しないでください)。 – user2953466

答えて

2

これはリンクステップの問題であり、実行時の問題ではありません。

あなたは問題として記述したものから、私はあなたがこのことについて正しいとは思わない - それはあなたが(当然)その意志をリンク中に採用することができるソリューションを探しているため、実行時の問題のように聞こえます実行時の問題を解決してください。

リンクに問題がないと思われる理由は、リンクが意図したとおりに動作しているように思えるからです。 LD(またはGCC)はリンクについて不平を言っておらず、あなたのリンクされた実行可能ファイルは正常に生成されています。あなたが持っている問題は、後でそれらの実行可能ファイルを実行すると、ローダーはあなたが意図しているもの以外のライブラリを見つけることです。リンク中の-Lフラグの目的は、リンクされたバイナリの作成に使用する適切なライブラリがどこにあるかをリンカに知らせることです。これは、実行時にローダーが必要なライブラリーを検索する場所とは完全に異なります。

あなたは、ローダーがライブラリを検索するパスのセットを変更することで問題を回避できる実行時に(LD_LIBRARY_PATHの変更など)採用できる方法があることはすでに認識していますが、どのような理由であれ、実行時環境を制御する必要はないため、これは必要ありません。

幸いにも、私はあなたが望むものを得ることができると信じている施設があります。 オプション(GNU ld man pageを参照)を-rpathという名前で見てください。基本的に、-rpathオプションを使用してリンク中にパスを追加すると、それらのパスはリンクされた実行可能ファイルに格納され、LD_LIBRARY_PATHに含まれていると検索されるのと同じように、実行時にライブラリを見つけることができます。これは、LinuxまたはMac OS X(少なくとも10.5以降)で動作するはずです。

-rpathオプションをgcc経由でldに渡すには、-Wlオプションを使用してフラグを渡す必要があります。 ld -rpath /custom/path/to/libsのようなgcc呼び出し何か必要が含まれていldコマンドライン取得するには:gcc -Wl,-rpath,/custom/path/to/libs要するに

を、あなたが現在持っているもの交換してください:-L/users/me/mylib -lpcre -lz

で:-L/users/me/mylib -Wl,-rpath,/users/me/mylib -lpcre -lz

結果の実行可能ファイル(またはライブラリ)ライブラリを探す場所として/users/me/mylibが格納されます。は、LD_LIBRARY_PATHを制御することなく、libpcre.solibz.soを見つける必要があります。を見つける必要があります。

+1

Hmm。私の印象は、 'LD_LIBRARY_PATH'がrpathよりも優先されるという印象でしたが、私は実際にその印象が正しいことを確信していないことを認識しています。 –

+0

私が理解しているように、-rpathはLinuxのinstall_name_toolのバージョンです。私のオリジナルの質問とは関係なく、ldが私のコマンドで提供したパスとは異なるパスを見つけて保存しているように見えたのは良いことかもしれません。 -Lの行。私はこれをテストしようとしていますが、私は上記のバージョニングの問題に関係していると思います。私がobjdump -p libpcre.soを実行した場合、libpcre.so.1が必要であることが示されます(Elf SONAMEフィールドと思われます)。しかし、私のディレクトリには含まれていません。 – user2953466

+0

libxxx.soとlibxx.so.n(nは共有ライブラリに記録されている値)の両方を確実に行う実験では、問題は解決されませんでした。 Linuxでは、LD_LIBRARY_PATHからgccが渡されたコマンドラインの後ろに-L dirsの1つとしてlibxxxの位置が記録されています。Mac OSXではMacportsディレクトリ(/ opt/local/lib)も記録しています私が見ることができる方法でも、それを通さないと、それが検索していると主張するディレクトリには報告されません。これは私を怒らせている! – user2953466

関連する問題