Linuxは、の.soおよび.oファイルは.aであり、リンクで命名します

.so .A、およびLinuxのの.oファイルの関係を説明する前に、窓のOBJ、LIB、dllファイル、exeファイルの間の関係を見てみましょう

 

窓のOBJ、LIB、dllファイル、exeファイルの下の関係

    libとdllが対応しています。libには、静的ライブラリのリンクライブラリで、DLLライブラリファイルはダイナミックリンクライブラリです。 
    いわゆる静的リンクは、内部の何かを置くための時間あなたはexeファイルの不要になっLIBを実行した後、あなたのexeファイルを手配抽出する必要があります。
    いわゆる動的時間は、DLLなしで、あなたはexeファイルを実行することはできません、提供して実行exeファイルのDLL関数に依存しています。 
    
    libに、DLLは、EXEファイルを究極の目標とみなされ、それが最終製品です。そして、C / C ++ソースコードが属します。ソースコードと究極の目標は、実際には、トランジションの中間コードOBJを文書化するためにあなたがターゲットファイルを得れば、中間コードの必要性が不可能である理由です。たとえば、exeファイルは、cppのファイル生成の多くを必要とします。コンパイラは、唯一のcppファイルをコンパイルすることができます。統一リンクが必要なEXEした後、すべてでなければならないのcppはOBJにコンパイルされたときにCPPコンパイラがobjにコンパイルされます後ように良い、いずれかのリンクの欠如がobj exeファイルの失敗をリードすることを指摘しておかなければ。
    
    コードに保存されている1.objは、データを使用してコンパイルし、名前を持っているので、接続時に時々問題未解決の外部シンボルが表示されます。ときはexeファイル名への概念が存在しなくても後に、アドレスのみ。LIBは、OBJの束を組み合わせたものです。
    2.理論的には(OBJファイルはCPPを置き換えるためにOBJを参照することができますコンパイルされ、そのCPPファイルと同等とみなすことができる、CPPはまた、OBJを置き換えるために追加することができます)他のプロジェクトを参照するために、OBJファイルに接続することができますが、実際には通常のlibプロジェクト間の相互参照を実現しています。
    3.コンパイラは、指定されたいくつかの一般的に使用されるライブラリ、他のニーズへのリンクがデフォルトになります。
    
DLLとLIBの違い

    (1)libにはコンパイル時に必要とされ、DLLは、実行時に必要とされています。あなたは完全なソースコードをコンパイルしたい場合は、十分なLIBを持っています。プログラムが起動している動的な接続を行う場合は、十分なDLLがあります。当然の開発とデバッグ相、そこに最高で。
    (2)一般的な動的ライブラリプログラムはLIBファイルやdllファイルを持っています。LIBファイルも、コンパイル時にアプリケーションを受けなければなりませんが、dllファイルが実行されて呼び出されます。DLLファイルは、対応するLIBファイルは通常、インデックス情報の一部、dllファイル内の特定の実装がある場合。唯一のlibファイル場合、これは、静的libにファイルをコンパイルし、及び実施されたインデックスでています。静的にコンパイルlibにファイル良いです:ユーザーは動的ライブラリをインストールしてからハングアップするために必要はありません。しかし、大規模なアプリケーションにつながった欠点がありますが、また、バージョンアップの際に、動的ライブラリの柔軟性を失い、仕事のための新しいアプリケーションを公開します。
    (3)動的ライブラリの場合は、2つのファイルが存在し、1はインポートライブラリ(.LIB)ファイルが(実際には、静的ライブラリとなりますが、exeファイルへのリンクでDLL関数のエントリをリンクするときにのみ、そして、実際の静的リンクライブラリは、exeファイル本体への実際のリンク、実際に達成するために、静的リンクを用いて行うダイナミックリンクLIB)として機能するとは異なり、DLLファイルで、関数を含むインポートライブラリファイルには、エクスポートされたDLLの名前です。そして、場所は、DLLは、実際の関数やデータ、アプリケーションはLIBファイルが実行可能ファイルにコピーされていないDLLファイル、ライブラリ関数やデータを使用する必要にリンクされて使用するので、アプリケーションの実行可能ファイルが含まれています1つ以上のアプリケーションが、プログラム・コードと機能コードを実行している場合ように機能コードは、呼び出されていない保存されますが、呼び出されるDLL内の関数のメモリアドレスされるので、メモリリソースを節約、リンクと呼ばれています。上記の説明、DLL、および.LIBファイルから分かるように、それ以外のアプリケーションがエラーを生成します、アプリケーションと一緒に発行する必要があります。

DLL内の2つの機能に分ける: 
    (1)DLLの機能は、アプリケーションの呼び出しのために利用可能であるエクスポート;
    (2)内部DLL関数はDLLでのみ使用することができ、アプリケーションは、それらを呼び出すことはできません

静的リンクライブラリを作成し、ダイナミックリンクライブラリを作成します

    VC6作成[Win32ダイナミックリンクライブラリ]プロジェクトは、空のDLLプロジェクトを作成することができます。

    VC6作成[Win32の静的ライブラリ]プロジェクトでは、空のプロジェクトLIBを(静的リンクライブラリプロジェクトのみのlibファイルを生成します)を作成することができるようになります。

:一般的なアプローチのlibファイルを2つ持っている追加 
    VCのLibディレクトリ内の.lib *、1 
    、2 addtionalのライブラリパスにリンク- >入力のプロジェクトの設定を変更し、ディレクトリのdll:実際に実行されていますバイナリコード、位置決めコード!

    3、直接ファイルパス内のlibオブジェクト/ライブラリで書かれていてもよい。(ここでは、実際にどのOBJのlibファイルまたはファイルに書き込むことができます)。

 

 

 

linux .o,.a,.so

        .o、ターゲットファイル、.objファイル内窓のと同等である 

  動的リンクのための共有ライブラリの.so共有されているオブジェクトは、ウィンドウの下にDLLの同等の 

  静的ライブラリ.Aは、複数の.oでは良いフィット感があります一緒に静的リンクと 

 

静的ライブラリ
機能:簡単な、それがターゲットプログラムに追加される前に、実際には通常のオブジェクト・ファイル、プログラムの実行のコレクションです。
長所:いくつかの以前のプログラムとの互換性、簡単な説明、開発者はソースコードの機密性を維持することができ、それはプログラマが(明らかな利点を持っている)時間の再コンパイルされたコードを保存し、コードを再コンパイルせずにプログラムをリンクすることができます。理論的には、高速スタティックライブラリは、コードが走行速度よりも、共有ライブラリまたは動的とすることができる(約1%〜5%)を生成したELFを使用して
生成された:使用プログラムAR(略称アーカイバ)。AR RCS my_lib.a f1.o f2.oオブジェクトコードf1.oとf2.oは(それが作成したmy_lib.a存在しない場合)、このライブラリファイルをmy_lib.aに追加された
使用:GCCで実行可能なコードを生成します-lパラメータを使用する際に追加されるライブラリ関数を指定します。また、-L -lパラメータとは、コマンドをldのことができます。
 
ライブラリ共有
    実行可能プログラムをロードするために起動時に共有ライブラリを、自動的に再実行されているすべてのプログラムの機能で共有ライブラリをロードすることができます。ただ、私は非常にかすかな参照すでに命名それについての.soファイル複雑な気持ち、 -整頓、共有ライブラリのニーズ:sonameと、本当の名前、名前の別の翻訳主張があります。次説明する順番に:
SONAME:フォーマットする必要があります:LIB +名前+の.so +ライブラリのバージョン番号情報(しかし、非常に低レベルのCライブラリ関数を覚えては、libという名前の始まりではありません)。例:/usr/lib/libreadline.so.3
本名:名前がメジャーバージョン番号とリリース番号があり、それの本当の名前があることを示唆しています。しかし......例を見つけることができなかった
ように、最後の0.3上記の例のように、コンパイラの必要性は、ライブラリのsonameとバージョンの名前であるときの情報が含まれていませんが、削除することができます。
所在地:共有ライブラリファイルは、オープンソースのために、特定のディレクトリに配置する必要があり、GNUの標準は、すべてのライブラリファイルは/ usr / local / libディレクトリに配置されていることをお勧めします、そして提案ため、実行可能プログラムは、/ usrです。 / local / binのディレクトリに移動します。これは、それだけに使用されている。しかし、あなたは情報はは/etc/ld.so.conf構成情報内で見ることができる特定の場所を変更することができます。もちろん、あなたが自分自身の特別なパス要件の一部を追加し、このファイルを変更することができます。
作成:方法とeasyeclipse環境下でのgccを作成する2つの方法を見つけるためにインターネット。
gccの方法:
    まず内部のgcc -fPIC共有ライブラリにより、コマンドパラメータに加盟するオブジェクトファイル、標準フォーマットを作成:gccの-shared -Wl、-soname、your_soname -o LIBRARY_NAME file_listのlibrary_list( この標準フォーマットで正直見てgccのtest_a.c test_b.c test_c.c -fPIC -shared -o:良いコンプレックスまで、私は例を見つけたが、それはその標準フォーマットと若干異なるようです libtest.so)
:easyeclipse環境での.soファイル生成
        1 C ++プロジェクトをビルドするための新しいプロジェクトを選択
        プロジェクトタイプのオプションで共有ライブラリを選択し、[完了]をクリックし、プロジェクト名のPXXXを記入2.を。
        3.プログラムを記述し、コンパイル、デバッグにlibPXXX.soファイルを生成したり、解放し、[プロパティ]メニューのオプションプロジェクトをクリックしLIBの始まりをマークしていない場合は、右のポップアップにアーティファクトページ、出力prefixオプションのビルド]をクリックしますインターフェイスします内容は空にすることができます。
        4. C ++プログラム、インターフェース関数はヘッダファイル内の前のプラスのextern「C」タグで述べた場合は、次のタグを追加:
__cplusplusの#ifdefの  
#extern「C」{  
#endifのの  
   
ヘッダ本体  
   
__cplusplusの#ifdef  
}  
#endifの  
     場合上記マークのない関数の名前は、関数名ではありませんでので、プログラムを書くときに、コンパイルした後、あなたが設定され、開発プロジェクトのファイルリストの中間点の左側にあるデバッグ環境PXXX.oで開いアイテムあなたがファイルを見ることができるので、 )使用する関数の名前がのFunc(設定されているような、自分の設定した関数名プラス__Fiマークの後ろにあり、その関数の名前で関数名はFunc__Fi()、または他の名前でした。
インストール:その後のldconfigを実行し、指定された標準のディレクトリに共有ライブラリファイルをコピーします。あなたがそうする権限を持っていない場合は、環境変数を変更することで、これらのライブラリを使用して実装する必要がありました。この方法は、もはや、非常に複雑と言うではありません。
表示:あなたがプログラムで使用lddは共有ライブラリを実行することで見ることができます。例えばLDD / binに/ lsの。このようNM libXXX.soとして、コマンドNMを使用する.soファイルを表示します。(静的ライブラリと共有ライブラリのためのNMが機能している、注意してください)
あなたは、ライブラリ内の他の機能を維持しながら、多くの機能をカバーする独自の関数ライブラリを使用する場合は、/ etcにあることができます:カバレッジに/ld.so.preloadは、ライブラリ(.oのファイル拡張子)、優先度の負荷を持っていますこれらのライブラリ関数のプリロードを置き換えるために追加されました。
アップデートについて:このファイルを保存し、新しい上昇ライブラリを動的にロードするたびに、削除したり、キャッシュファイル/etc/ld.so.cacheを更新するために再実行されるように、ライブラリへのldconfigをライブラリパスを変更しますダイナミックリンクライブラリの名前のソートされたリスト

(Linuxでは、行わ/lib/ld.soによってロードされた共有ライブラリは、ld.soは共有ライブラリをロードするとき、それはld.so.cacheから見えます)

 

 

 

 

私たちは、通常、他のプログラムで使用するためのライブラリの中に作られたいくつかのパブリック関数を置きます。ライブラリには2静的および動的ライブラリに分かれている
種。コンパイルされた静的ライブラリプログラムは、オブジェクトコードに接続され、あなたは、もはやプログラムが実行されている静的ライブラリを必要としません。ダイナミック
アセンブリ時にライブラリとオブジェクトコードに接続されていないが、プログラムのみが実行されていたがロードされ、そのプログラムを実行
Shihaiラインは、ダイナミックインベントリに必要。本論文では、一例としてに、Linuxでの静的および動的ライブラリを作成する方法を説明するために
それらを使用。

ライブラリを作成する前に、の.oファイルにコンパイル例ソースプログラム、ソースコードやライブラリを用意しましょう。


ステップ1:例の編集の手順は--hello.h、のhello.cとmain.cのを取得し、

ハロー共通関数を含むのhello.c(手順2を参照)ソースプログラムライブラリ、画面上の機能出力「
こんにちはXXX!」hello.hヘッダファイルライブラリ(手順1を参照)。main.cのテストのライブラリ(プログラム3を参照)
、メインプログラム内のメインプログラムは、ハローパブリック関数を呼び出します。

プログラム1:hello.h

#ifndefのHELLO_H
の#define HELLO_H

無効こんにちは(のconstのchar *名);

#endifの// HELLO_Hの



手順2:hello.cを

する#include <stdio.hに>

無効こんにちは(のconstのchar *名)
{
のprintf( "%Sこんにちは\のN-!"、名);
}

手順3:main.cの

#include "hello.h"

int型のmain()
{
ハロー( "全員");
0を返す;
}

手順2:のhello.cは.oファイルにコンパイル、

スタティックライブラリまたはDLLがなされているかどうかの.o作成されたファイル。したがって、我々は、Gを介してソースをhello.cにしなければならない
CC最初のコンパイルの.oファイル。

hello.oファイルを取得するには、システムプロンプトで次のコマンドを入力します。

gccの-cのhello.c#の



私たちはLSを実行するには、hello.oファイルの生存かどうかを確認するためのコマンド。

LS#

hello.cのmain.cのhello.h hello.o




lsコマンドの結果に、我々はhello.oファイルを参照して、この手順は完了です。

のは、静的ライブラリを作成し、それを使用する方法を見てみましょう。

ステップ3:;静的ライブラリ.oファイルを作成し

、LIBが付いている静的ライブラリファイル名を命名静的ライブラリ名、拡張子.Aと続きます。例えば:私たちがします
MyHelloと呼ばれる静的ライブラリを作成し、静的ライブラリのファイル名はlibmyhello.aです。あなたは静的ライブラリを作成して使用する場合、
あなたは、この点に注意を払う必要があります。arコマンドで静的ライブラリを作成します。

静的ライブラリファイルlibmyhello.aを作成するために、システム・プロンプトで次のコマンドを入力します。

アルゴン-cr libmyhello.a hello.o# #



我々はまた、結果を表示するために、lsコマンドを実行します

。#LSを

hello.h hello.o libmyhello.aのmain.cのhello.c

#の

LSコマンドの結果はlibmyhello.aを持っています。

ステップ4:プログラムに静的ライブラリを使用して、

静的ライブラリは、それはそれの内側に機能し、どのようにオーバー作りますか?パッケージには、唯一の共通のソースのこれらの関数を使用する必要があります
から、コマンドのgcc、gccの意志を生成するときに、そのような共通の機能を含むプロトタイプ宣言静的ライブラリとターゲットファイル名を示す
静的共通ライブラリ関数にターゲットファイルへの接続します。gccがライブラリ名の前に静的libに接頭辞され、その後、追いかける、注意
静的ライブラリファイル名の拡張子のは、静的なライブラリファイルを見つけるために取得.A。

プログラム3では:main.cの、我々は、ヘッダファイルは、メインプログラムで直接主な公共を呼び出し、その後、静的ライブラリをhello.h含ま
ハロー機能付き。氏は、以下の対象プログラムとしてハロー、ハロー、その後、プログラムを実行し、何が起こるかを参照してください。

#gccの-oハローのmain.cの-L間の方法。-Lmyhello 、 またはGCCのmain.cの-L。-Lmyhello -oハローカスタムライブラリ、main.cのも置い-L。そして-lmyhelloしかしそれは、タリアを配置することはできませんそれ以外の場合は定義されていないMyHelloとを要求されますが、それは、そのようなグラムなどのシステムライブラリは、++ -o(-Lは/ usrメインである / libに)-lpthread main.cppに間違って行くではありません。

アクトII #gcc main.cのlibmyhello.a -oハローやgccの-oハローmain.cのlibmyhello.a

方法3:氏チェンmain.o:GCC -c main.cの、その後の実行可能ファイルを生成する:GCCハローmain.o libmyhello.aまたはをgccmain.o -oこんにちは、このような動的ライブラリを接続することができるlibmyhello.a -oやります。



./Hello#

みなさん、こんにちは!



私たちは本当にハローにターゲットファイルに接続しようとハロー公共機能するかどうかを静的ライブラリを削除します。

Libmyhello.a RM番号の

RM:削除libmyhello.a通常のファイル`「y軸?

./Hello#

みなさん、こんにちは!

#の

共通機能の通常、静的ライブラリとして実行するためのプログラムは、ターゲットファイルに接続されています。

私たちは、Linuxでの動的ライブラリを作成する方法を見続けています。私たちは、.oファイルから起動します。

ステップ5:.oファイルによってDLLファイルを作成し、

動的ライブラリファイルの命名名と静的ライブラリのファイル名の命名同様の規則が、また、動的ライブラリ名の接頭辞libに増加しますが、
ファイル拡張子は.soです。例えば:私たちはMyHelloと名前の動的ライブラリを作成し、その後、動的ライブラリのファイル名はlibmyhです
ello.so. GCCは動的ライブラリを作成するために使用されます。

システム・プロンプトでlibmyhello.so動的ライブラリファイルを取得するには、次のコマンドを入力します。



#のgcc -shared -fPIC -o libmyhello.so hello.o( -o 不可欠)



我々はまだLSがダイナミックリンクライブラリファイルが生成されるかどうかを確認するためにコマンドを使用します。

#Lsを

hello.h hello.o libmyhello.soのmain.cのhello.c



ステップ6:プログラム内で動的ライブラリを使用して、

動的ライブラリを使用して、プログラムと全く同じ静的ライブラリを使用するだけでなく、ソースにこれらのパブリック関数の使用で含まれ
、これらのプロトタイプ宣言パブリック関数、その後、gccのコマンドを使用するときに生成される動的ライブラリコンパイルされたオブジェクトファイルの名前を指定します。私たちは、
ターゲットファイルを生成して、結果を確認するためにそれを実行するために、gccのコマンドを実行します。

こんにちはmain.cのはgcc -o#。-Lmyhelloを-L



(または#gcc main.cのlibmyhello.so -oハロー(無libmyhello.soは、間違ったことはない)間違って行くではないが、その後./helloがエラーを要求されます、接続は、現在のディレクトリに動的ライブラリのために使用されますが、実行されているものの、それがファイルを見つけるために、ライブラリ内には/ usr / libにあるので、OKとディレクトリは/ usr / libのにlibmyhello.soファイルをコピー)

#./hello

./hello:エラーがしばらく共有ライブラリをロードする:libmyhello.so:シャー開くことができない
EDオブジェクトファイル:そのようなファイルやディレクトリ



ああ!間違いました。エラーメッセージで簡単に見には、オリジナルのファイルがlibmyhello.so動的ライブラリを見つけることができません。実行時にプログラムは、
/は/ usr libと/ libと他のディレクトリに必要な動的ライブラリを探します。見つかった場合は、ダイナミックロードライブラリが。そうでなければ、
ショーは、上記のエラーに似ており、プログラムを終了します。私たちは、ディレクトリは/ usr / libのにlibmyhello.soファイルをコピーし、しようとします
再び。

MV libmyhello.soます。#/ usr / libに

./hello#

みなさん、こんにちは!



成功しました。また、さらにダイナミックなランタイムライブラリが必要とされている示しています。

我々は振り返るとgccコマンド・ターゲット・プログラムにコンパイル静的および動的ライブラリの使用は、まったく同じ使用していることを見つけ
、静的および動的ライブラリが同じ名前、gccのコマンドライブラリは、それをどのような場合に使用するときということ?問題の保持することは気分が最後に訴えられるだろう
、それを試してみることに。

最初にすべての.cおよび.hファイルを削除するに加えて、私たちの状態に復元だけでサンプルプログラムの編集を終えました。

RM -f hello.o /usr/lib/libmyhello.soこんにちは#の

#のLS

のhello.cのmain.c hello.h



にlibmyhello.a libmyhello.so静的ライブラリファイルと動的ライブラリファイルを作成します。

構築動的ライブラリは位置独立コードを生成するように、-fPICを使用する必要がある場合、コードとデータセグメントの目的は、共有

#1 GCC -c -fpicのhello.c //はのhello.cをコンパイルするときにも-fpic追加する必要があります-fPICとRECOMPILE;オプション、そうでない場合RODATAは、「共有オブジェクトを作る際に使用することができません

#アルゴン-cr libmyhello.a hello.o(または-cvr)

#gccの-shared -o libmyhello.so -fPIC hello.o

#LS

hello.h hello.o libmyhello.a libmyhello.soのmain.cのhello.c



最後のlsコマンドを経由して、あなたはlibmyhello.s libmyhello.a静的ライブラリファイルと動的ライブラリファイルを見つけることができます
Oが生成され、現在されていますディレクトリ。その後、我々は、ターゲット生成MyHelloとライブラリを使用してgccのコマンドを実行します
ハローハローファイルを、プログラムを実行します。

-lmyhello(動的および静的ライブラリはもちろん、直接#gcc main.cのlibmyhello.a -oこんにちは、次いで、スタティックライブラリとして指定され、動的ライブラリの優先使用が存在#のgcc -oハローのmain.cの-L。 )

#./hello

./hello:エラーがしばらく共有ライブラリをロードする:libmyhello.soは:シャー開くことができない
ようなファイルやディレクトリはありません:ED・オブジェクト・ファイルを



同じ名前の静的および動的ライブラリは、gccのコマンドは、動的ライブラリの使用にも、動的ライブラリのディレクトリは/ usr / libと/ libに、など、libmyhello提出先となるデフォルトの優先順位を与えるときに実行するプログラムのハローの結果から知っていることは容易です。そうすることができ、ディレクトリは/ usr / libににコピー。

注意:
パラメータは解決コンパイル
メインGCCコマンドラインオプションです:
-sharedこのオプションは、ダイナミックリンクライブラリを生成する指定(T型コネクタは時々輸出シンボルの弱接続Wの種類を生成、エクスポートシンボルテーブルを生成させます)、このフラグは接続できないではない外部のプログラムです。実行可能ファイルに相当


-fPICコンパイル段階に作用する、位置独立コード(位置独立コード)を生成するようにコンパイラーに指示します。次いで、生成されたコードは、絶対的なアドレス、相対アドレスは、すべての使用はありません、そしてコード・ローダは、任意のメモリ位置にロードすることができるため、正確に行うことができます。これは、共有ライブラリで必要とされる共有ライブラリをロードされている、メモリ内の位置は固定されていません。

FPICはない場合には、コンパイルされたコードは、それら各プログラムがなければならない(それがコード位置独立コード内にないように)、複数のアプリケーションが共通に使用される場合、負荷に応じて装填位置に再配置する必要があります(各プログラムのようにロードされた位置が異なるため、明らかにこれらのコードの再配置が異なった後、もちろん、共有することができない)。コードのコピーがそうで維持します。

コンパイルされたコードは、このオプションは、位置に関連していないので、ダイナミックローディングコードセグメントシェアの真の目的コードのコピーを介して異なるプロセスのニーズを満たすことである、ではありません。

。行をコンパイル、静的ライブラリファイルは、裏面に使用されるソース・ファイルとすることができる、など:GCC -Lは/ usr / libにMyPropで(Sライブラリ; -L現在のディレクトリに接続するライブラリを表し .. C libtest.a libX11.a libpthread.a -o MyPropで
前記-Lコンパイラは、以前の「アクトII #gccmainとして、現在のディレクトリに指定されたデフォルトのライブラリファイルを検索する場所を指定するための/ usr / libのライブラリファイル。 )ハローC」libmyhello.ao


名を決定するための.soまたは.aのライブラリーに続いて、ダイナミックリンクライブラリ、LIBで前に与えられた名前を、見つけるために、コンパイラを命名暗黙のを持っている-lmyhello libmyhello.soまたはlibmyhello.a。
LD_LIBRARY_PATH環境変数は、動的な負荷経路を動的ライブラリに接続することができることを示しています。
あなたがroot権限を持っている場合はもちろん、あなたはは/etc/ld.so.confファイルを変更することができますし、同じ目的を達成するために/ sbinに/ ldconfigを呼び出しますが、ノーroot権限であれば、その後、出力LD_LIBRARY_PATHの唯一の方法。

いくつかの問題がしばしば発生した動的ライブラリを呼び出すとき、時々 、明確に「-I」経由でライブラリのヘッダファイルのディレクトリを持っている「-L」パラメータによって、ファイルが案内して指定するためのライブラリ「を含みます- L「ライブラリ名が、それは生と死で、lddコマンドに目を通すが、あなたがそうリンクを指定したファイルを見つけることができません、あなたがしなければならない動的ライブラリを指定するかは/etc/ld.so.conf LD_LIBRARY_PATHファイルを変更してすることですディレクトリ。通常、この問題はリンクすることはできませんライブラリで解決することができます。

 

 

 

静的リンクライブラリの検索パスの順序:

1. LD(GNUリンカ)は、GCCコマンドのパラメータがあります-L

   、コンパイラ(編集)、コンパイル(アセンブリ)と接続(リンク)(また、プリコンパイルされ、前処理として知られている)の前処理[:コンパイルプロセスは4つの段階に分かれてリンク ]
gccの環境変数はLIBRARY_PATH見つける2.
3.検索をデフォルトのディレクトリ/ libには/ usr / libには/ usr / local / libのコンパイルはgccで元のプログラムで書かれています

ときに動的リンク、検索実行パスの順序:

1.動的ライブラリの検索パスを指定したときにコンパイルされたオブジェクトコード
環境変数LD_LIBRARY_PATH 2.動的ライブラリ検索パスの指定された
コンフィギュレーション/etc/ld.so.confファイルは動的ライブラリの検索パスを指定した
デフォルトの動的ライブラリの検索パス4を/ libに
は/ usr / libにデフォルトの動的ライブラリの検索パス5.

環境変数:
LIBRARY_PATH環境変数:プログラムの静的リンクライブラリファイルの検索パスを指定します
LD_LIBRARY_PATH環境変数を:プログラムダイナミックリンクライブラリファイルの検索パスを指定します。

 



もう一つは:

以上のことから、見つけるために、どのように動的ライブラリは、以下の3つの方法を生成した:

(1)ライブラリは/ usr / libと/ libにコピーされます。

(2)LD_LIBRARY_PATH環境変数にライブラリパスを追加します。

そのような/ホーム/たとえば/ libディレクトリに動的ライブラリlibhello.soとして:

LD_LIBRARY_PATHをエクスポート= LD_LIBRARY_PATH:/ホーム/例/ LIB

は/etc/ld.so.confファイルを変更し、ライブラリファイルのパスは、最後に追加されている(3)。 (ないプラスパスの前に、ファイルの末尾に直接書き込みには、)、および主にデフォルトの検索ディレクトリ(/ libと/ usr / lib)と動的ライブラリの設定ファイル/ etc / LDに、(ldconfigをコマンドをldconfigをリフレッシュ目的を実行します。これにより、ダイナミック・ローダー(ld.so)との接続に必要なキャッシュファイルを作成し、(以前に、LIB * .soの*形式に記載されているように)ディレクトリso.confに記載されている、共有可能なダイナミックリンクライブラリを検索キャッシュファイルは、デフォルトの/etc/ld.so.cacheで、良いシーケンスを行ダイナミックリンクライブラリのファイル名のリストを保存します。)。このように、ディレクトリに追加されたすべてのライブラリのファイルが表示されます。

添付:以下の静的ライブラリシステムに接続するには、このようなパスを指定して、あなたは見つけることができないライブラリを接続したいというエラーを取得します:

G ++ -oメインmain.cppには-Lは/ usr / libにlibpthread.a 

グラム++ -oメインmain.cppに操作を行う必要があります-Lは/ usr / libに-lpthread本当でした。

次は/ usr / libにするためのカスタム・テスト・ライブラリ、

G ++ -oメインmain.cppに-Lは/ usr / libにlibpthread.a libthread.a libclass.a間違っていることが、このG ++ -oメインmain.cppに-Lは/ usr / libに-lpthread -lthread -lclassそれを正しく。

 

http://blog.csdn.net/chlele0105/article/details/23691147からの振替

おすすめ

転載: www.cnblogs.com/wangshaowei/p/11285341.html