g++リンクダイナミックライブラリと静的ライブラリの問題

2391 ワード

リンクC++プログラムをg++でコンパイルする場合、サードパーティ製のライブラリが含まれている場合は、必要なライブラリファイルを手動で指定する必要があります.ライブラリファイルには2種類あり、1つは動的ライブラリであり、1つは静的ライブラリであり、具体的な違いは簡単で、一般的に言えば、1つは実行時に動的にロードされ、1つはリンク時に直接ライブラリファイルをプログラムにコピーし、実行時にライブラリファイルに依存しなくなる.
たとえば、libtiffライブラリとlibxml 2ライブラリをプログラムで使用します.
1.ダイナミックライブラリへのリンクg++ -I./kufile/libxml/include/libxml2 -I ./kufile/tiff/include -L./kufile/libxml/lib -L ./kufile/tiff/lib -lxml2 -ltiff -o main *.cpp上のコードを分析し、現在のすべてをコンパイルしてリンクする.cppファイルは実行可能ファイルmainです.リンクのコンパイル中、g++はシステムのデフォルトパスに行ってヘッダファイルとリンクライブラリを探します.これらのディレクトリは/lib,lib 64/,/usr/lib,usr/includeなどではなく、具体的には自分で見ることができます.
(1).-Iは、後のディレクトリをg++ヘッダファイルの検索パスに追加し、ここで私の等ヘッダファイルを上のディレクトリに置く.対応するディレクトリを含まずにサードパーティ製のヘッダファイルが含まれている場合は、「ヘッダファイルが見つかりません」などのエラーが発生します.
(2).-Lは、後のディレクトリをg++リンクライブラリの検索パスに追加し、ここでlibxml 2を表示します.so,libtiff.soは上記のディレクトリに入れます.同時に、対応するリンクのライブラリ-lxml 2、-ltiffを書き出して表示します.-Lを書かずに-lxml 2などだけ書くと、「-lxml 2が見つからない」などのエラーが発生します.リンクライブラリのディレクトリ表示を検索ディレクトリに追加しないと、「未定義宣言」などのエラーが発生します.
注意:リンクをコンパイルして実行可能ファイルを生成すると、実行時に「libxml.so,libtiff.oが見つかりません」などのエラーが発生します.ここでは、g++がリンク時にサードパーティライブラリを検索したときにリンクが成功しました.しかし、実行中に、対応する外部関数が呼び出されると、プログラムは再びサードパーティのライブラリを探しに行きます.デフォルトの検索ディレクトリがないため、ライブラリが見つからない場合があります.これは、コンパイルリンクコマンドを変更する必要があります.g++ -I./kufile/libxml/include/libxml2 -I ./kufile/tiff/include -L./kufile/libxml/lib -L ./kufile/tiff/lib -lxml2 -ltiff -Wl,-rpath=/home/inter-rpath/Integrationfinal/alllib -o main *.cppは-Wl,-rpath=「具体的なディレクトリ」に参加する必要があり、サードパーティライブラリパスをプログラム実行時の検索ディレクトリに表示します.ここでは、上のサードパーティをalllibディレクトリの下に入れることができます.
注意:ここでは絶対パスを使用することをお勧めします.最後の実行可能プログラムがソースコードと同じディレクトリに配置され、他のプログラムと同様にsystem(「main」)などのコマンドで呼び出されない場合は、相対パスを使用します.実行可能ファイルが最後にソースコードと同じディレクトリに入れない場合、またはプログラムが他のプログラムに類似システム(「main」)で呼び出された場合、libxml 2が相対ディレクトリで見つかりません.so,libtiff.soなどのダイナミックリンクライブラリ.
2.静的ライブラリへのリンク
まず、静的リンクライブラリを使用することはあまりお勧めしません.複雑なプログラムでは、実行可能なファイルのボリュームが大きくなる一方で、リンクをコンパイルするときにさまざまな奇妙なエラーが発生します.ただし、基本的な静的リンク・ライブラリをリストする方法は、次のとおりです.
注:ダイナミックライブラリと静的ライブラリを同じディレクトリの下に配置すると、上記の方法では、ダイナミックリンクライブラリがデフォルトで優先的に呼び出されます.
(1).上記の静的ライブラリをリンクする方法では、そのディレクトリは静的ライブラリのみを置くことができます.そうしないと、動的ライブラリが優先的にリンクされます.
(2).フルパス使用【推奨】g++ main.cpp build/libtest.a ‐o helloworld
(3).‐static:すべてのライブラリに静的ライブラリバージョンを強制するg++ main.cpp ‐o helloworld ‐static ‐Lbuild ‐ltest
欠点:libc、libstdc+++を含むすべてのライブラリは静的ライブラリバージョンを提供する必要があります.少なくとも1つはできません.