Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxについて >> Linuxのldリンク並べ替え方法

Linuxのldリンク並べ替え方法

  

Linuxシステムコネクタのldリンク順序が正しくないと、未定義の参照関数エラーが発生する場合があります。次の小シリーズは、Linuxでの接続方法を示していますldがリンクされている順番。

リンクライブラリのシリーズのLD元の順序は、それ以外の場合は、関数の定義が見つからないことを意味し、参照未定義エラー関数シンボルを報告します、非常に敏感です。実際、ライブラリは正しく開くことができます。ライブラリlibA.aがライブラリlibB.aに依存している場合、コネクタの引数はln -lA -lBになります。これは、次のように記述する必要があります。そうでなければそれは間違っているでしょう。

これは歴史の遺産のようです。端的に言えば、ライブラリが重要ではないと判断した場合、それは最後に置かれます。つまり、ライブラリがロードされる順序が左から右の順になります。これが、昔のマシンが壊れた理由です。 CPUを含む内蔵およびハードドライブは非常にまれで貴重です。ですから、必要なものは事前に入手しておく必要がありますが、一度必要になったらロードし、必要でなければロードしないでください。これは上記のエラー、socketcommにロードされたコンパイラが説明することができ、依存ライブラリがあることを発見し、そしてそれを探し、欠陥があるので、それは間違っています。

つまり、すべての人が共有できるように、依存関係はできる限り配置されます。

同じ関数名やクラス名を使用しているライブラリが複数ある場合、構造体の名前はどうなりますか?

nmやreadelf、lddなどのコマンドを使用して、ライブラリの依存関係とシンボルテーブル、およびエクスポートされた関数シンボルを表示できます。これにより、順序が異なるため、上記のさまざまなコンパイル結果を確認できます。

テストライブラリを動的と動的、静的と静的、そして静的に分類します。

最初のケース:静的ライブラリに同じ名前の関数が含まれています。

コードは次のとおりです。

gcc -L./main.c -lA -lB

コンパイルエラー、 `XXX‘の多重定義中。定義機能を繰り返してください。

2番目のケース:移動ライブラリ

これは、前述のように、左から順に、必要に応じてロードするロードの順序によって異なります。

コードのコードは次のとおりです。

gcc main.c。 /libB.so。 /libA.so

コードのコードは次のとおりです。

gcc main.c。 /libA.so /libB.so

このリンク方法は、暗黙のリンク、つまりロード時のリンクですが、以前の静的ライブラリはコンパイル時の接続です。

つまり、コンパイルの順序によって、ライブラリ内のどのライブラリが同じ名前で呼び出されるかが決まります。

3番目のケース:上記の静的読み込みではなく、動的読み込みです。

コードのコードは次のとおりです。

gcc main.c -ldl。 /libA.so /libB.so

コードのコードは次のとおりです。

gcc main.c -ldl。 /libB.so。 /libA.so

リンクオプションがない場合は、2番目のケースと同じです。 Lオプションを追加した後に、ロードするものを指定してください。

libBは静的リンクです。 libAは動的にロードされます。

コードのコードは以下のとおりです。

gcc -L./main.c -ldl&lndl; lB

動的ライブラリのライブラリ名がコンパイルオプションに表示されます。 >

コードのコードは次のとおりです。

gcc -L./main.c -ldl -lB。 /libA.so

コードのコードは次のとおりです。

gcc -L./main.c -ldl。 /libA.so -lB

静的および動的がある場合、コンパイルオプションに動的ライブラリライブラリ名を追加しないでください。静的ライブラリに追加されている場合、出力は正常になります。リンクの順序は関係ありません。

上記はLinuxシステムでのコネクタのldリンク順序の紹介ですが、順序が異なるとコンパイル結果も異なるため、依存関係は可能な限り配置されています。

Copyright © Windowsの知識 All Rights Reserved