C++プログラムをコンパイルするとき。 C++の ライブラリ関数とコード(例えば、ライブラリのコードなど)への参照が必要です。
libdyno.so
という仮想共有ライブラリがあるとします。最終的にはobjdump
またはnm
を使用して内部を覗くことができます。
objdump --syms libdyno.so
今日、システム上で共有ライブラリを使用してこれを行うことができます。 MAC上のobjdump
はgobjdump
と呼ばれ、binutils
パッケージにはBREWが付属しています。これをMacで試してみてください。
gobjdump --syms /usr/lib/libz.dylib
シンボルが共有オブジェクトに含まれていることがわかりました。あなたは、共有オブジェクトとのlink
あなたは、一般的に
g++ -Wall -g -pedantic -ldyno DynoLib_main.cpp -o dyno_main
なお、コマンドで-ldyno
のようなものを使用する場合。これはコンパイラ(実際にはリンカld)に、普通はそれらを探す場所であるlibdyno.so
という共有オブジェクトファイルを探すように指示しています。そのオブジェクトを見つけたら、必要なシンボルを見つけることができます。 -l
フラグを指定することで、開発者が動的ライブラリを読み込むよう要求されたため、循環依存はありません。
どのように、いつ動的ライブラリを使用しますか?どうやって作るの?何 で、このようなファイルを生成するために使用される特定のコンパイルコマンドであるとして 標準.cppファイルから
#include "DynoLib.h"
DynamicLib::DynamicLib() {}
int DynamicLib::square(int a) {
return a * a;
}
DynoLib.cpp
というファイルを作成し、ファイルの発信者DynoLibを作成します。 h
#ifndef DYNOLIB_H
#define DYNOLIB_H
class DynamicLib {
public:
DynamicLib();
int square(int a);
};
#endif
次のように共有ライブラリとしてコンパイルします。これは
g++ -Wall -g -pedantic -shared -std=c++11 DynoLib.cpp -o libdyno.so
あなたは今、私が与えたコマンドを使用して、このオブジェクトを検査することができます...のLinux固有である以前すなわち
objdump --syms libdyno.so
今DynoLib_main.cpp
#include "DynoLib.h"
#include <iostream>
using namespace std;
int main(void) {
DynamicLib *lib = new DynamicLib();
std::cout << "Square " << lib->square(1729) << std::endl;
return 1;
}
コンパイルという名前のファイルを作成しますそれは次の通りです。
g++ -Wall -g -pedantic -L. -ldyno DynoLib_main.cpp -o dyno_main
./dyno_main
Square 2989441
nm
を使ってメインバイナリを見ることもできます。次の例では、文字列square
があるかどうかを確認しています。すなわち、私のバイナリで参照されている方法でlibdyno.so
から必要なシンボルです。
nm dyno_runner |grep square
U _ZN10DynamicLib6squareEi
答えははいです。大文字のU
は未定義を意味しますが、これは先ほど作成したDynamicLibクラスのsquareメソッドのシンボル名です。奇妙な名前は、それが自分の話題である名前のmanglingに起因しています。
はどのようにしているものとする静的に私と同じようにリンクすることを知っています定期的なものを動的にリンクされたことになっている の.oファイルと?
あなたは知る必要はありません。あなたはリンクしたいものを指定し、コンパイラ(とリンカなど)に作業をさせます。 -l
フラグはライブラリ名を示し、-L
はどこに表示するかを示します。コンパイラはここの事
gcc Linkage option -L: Alternative ways how to specify the path to the dynamic library
それともman ld
を見てを見つける方法についてのまともな書き込みアップがあります。
-Lフラグと-lフラグは何ですか? たとえばコマンドラインで-lusbフラグを指定するとはどういう意味ですか?
上記のリンクを参照してください。これは、ldは アーカイブライブラリとLD制御スクリプトを検索するパスのリストに
-Lをsearchdir
追加パスをsearchdirを... man ld
からです。このオプションは、 の回数だけ使用できます。ディレクトリは、コマンド行で が指定されている順に検索されます。 コマンドラインで指定されたディレクトリは、デフォルトディレクトリの前に検索されます。すべて-L オプションは、オプションが表示される順序に関係なく、すべての-lオプションに適用されます。 -Tオプションはspecified.`
でない限り、あなたがここに得ることができた場合は、-Lオプションは、リンカ スクリプトのどのLDの検索には影響しません。それは、リンカすなわちLDについて学ぶために配当金を支払います。それは重要な仕事をしており、多くの人々がコンパイラを扱うことから始まり、compiler == linker
と考えているので、これは真実ではないので、混乱の大部分です。
ここで必要なものを見つけることができます... http://stackoverflow.com/questions/496664/c-dynamic-shared-library-on-linux – Harry