22

C ++を学ぶために、動的ライブラリと静的ライブラリに出くわしました。

私は一般的にそれらの要点を理解します:他のプログラムに含めるためにコンパイルされたコード。

しかし、私はそれらについていくつか知りたいです:

  • main()それらを書くことは、関数を除いて、通常のC ++プログラムと何か違うのですか?
  • コンパイルされたプログラムはどのようにしてライブラリになりますか?明らかに実行可能ファイルではないので、「test.cpp」を「test.dll」に変換するにはどうすればよいですか?
  • その形式になったら、別のプログラムに含めるにはどうすればよいですか?
  • それらを配置する標準的な場所はありますか?それにより、コンパイラー/リンカーがそれらを必要とするものは何でもそれらを簡単に見つけることができますか?
  • 動的ライブラリと静的ライブラリの(技術的および実用的な)違いは何ですか?
  • コードでサードパーティのライブラリをどのように使用しますか( MySql C ++コネクタのファイルを見つめてい.dylibます).a

私がライブラリに関連して見つけたものはすべて、ライブラリの使用方法をすでに知っている人を対象にしているようです。しかし、私はしません。(しかし、したいです!)

ありがとう!

(私はMac OS Xを使用していることにも注意する必要があります。また、IDEに依存しない、またはコマンドライン指向のままにしておきたいのですが、QtCreator / Netbeansを使用しています)

4

5 に答える 5

19

main() 関数を除いて、通常の C++ プログラムとは違うものを書いていますか?

いいえ。

コンパイルされたプログラムはどのようにしてライブラリになりますか? これは明らかに実行可能ファイルではありません。たとえば、'test.cpp' を 'test.dll' に変換するにはどうすればよいでしょうか?

コンパイル時にフラグを渡し-dynamiclibます。(結果の名前はデフォルトのままですa.out。Mac OS X では動的ライブラリにlib***.dylib、Linux ではlib***.so(共有オブジェクト) という名前を付ける必要があります)

フォーマットを取得したら、それを別のプログラムに含めるにはどうすればよいですか?

まず、ヘッダー ファイルを作成して、他のプログラムが#includedylib で使用できる関数を認識できるようにします。

次に、dylib にリンクします。dylib の名前が の場合、フラグを gcclibblah.dylibに渡します。-lblah

必要なコンパイラ/リンカーが簡単に見つけられるように、それらを置く標準的な場所はありますか?

/usr/libまたは/usr/local/lib

動的ライブラリと静的ライブラリの (技術的および実際的な) 違いは何ですか?

基本的に、静的ライブラリの場合、ライブラリ全体が「リンク」先のファイルに埋め込まれます。

コードでサードパーティのライブラリを使用するにはどうすればよいですか (MySql C++ コネクタの .dylib および .a ファイルを見つめています)

3番目の回答を参照してください。

于 2010-01-22T20:02:58.217 に答える
12

main() 関数を除いて、通常の C++ プログラムとは違うものを書いていますか?

ライブラリが他のプログラムが使用するサービスを提供するという明らかな違いを除いて、通常 (*) 違いはありません。

* gcc では、クラス/関数はデフォルトでエクスポートされます - これは VC++ には当てはまりません__declspec(export)

コンパイルされたプログラムはどのようにしてライブラリになりますか? これは明らかに実行可能ファイルではありません。たとえば、'test.cpp' を 'test.dll' に変換するにはどうすればよいでしょうか?

これはコンパイラによって異なります。Visual Studio では、プロジェクト構成でこれを指定します。gcc でスタティック ライブラリを作成するには、通常どおりコードをコンパイルし、ar. 共有を作成するには、最初にコンパイルし (-fpic共有ライブラリの要件である、位置に依存しないコード生成を有効にするフラグを使用して)、次に-sharedオブジェクト ファイルでフラグを使用します。詳細については、man ページを参照してください。

フォーマットを取得したら、それを別のプログラムに含めるにはどうすればよいですか?

繰り返しますが、これは少しコンパイラに依存しています。VS では、共有ライブラリの場合、使用するクラス/関数を含めるときに__declspec(import)(これは通常 ifdefs で行われます) でマークする必要があり、リンケージのために共有ライブラリの .lib ファイルを指定する必要があります。静的ライブラリの場合は、.lib ファイルを指定するだけで済みます (コードは実行可能ファイルになるため、エクスポート/インポートは必要ありません)。

gcc では、 を使用してリンクするライブラリを指定するだけで済みます-llibrary_name

どちらの場合も、パブリックな使用を目的とした関数/クラスを含むいくつかのヘッダー ファイルをクライアントに提供する必要があります。

それらを配置する標準的な場所はありますか?それにより、必要なコンパイラ/リンカーが簡単に見つけることができますか?

それがあなた自身のライブラリである場合、それはあなた次第です。通常、検索するリンカの追加フォルダーを指定できます。libソース ツリーには、すべての.lib(または .a/.so) ファイルが終了するフォルダーがあり、そのフォルダーを検索する追加フ​​ォルダーに追加します。

UNIX でライブラリを配布する場合、一般的な場所は通常/usr/lib(または/usr/local/lib) であり、gcc がデフォルトで検索する場所でもあります。

動的ライブラリと静的ライブラリの (技術的および実際的な) 違いは何ですか?

プログラムを静的ライブラリにリンクすると、ライブラリのコードが実行可能ファイルになります。実際には、これにより実行可能ファイルが大きくなり、明らかな理由で静的ライブラリの更新/修正が難しくなります (実行可能ファイルの新しいバージョンが必要です)。

共有ライブラリは実行可能ファイルとは別のものであり、プログラムによって参照され、(通常) 必要に応じて実行時にロードされます。

リンクせずに共有ライブラリをロードすることもできます。共有ライブラリと使用するシンボルを手動でロードする必要があるため、より多くの作業が必要になります。これは、Windows ではLoadLibrary/GetProcAddressを使用して行われ、POSIX システムではdlsym/を使用して行われますdlopen

コードでサードパーティのライブラリを使用するにはどうすればよいですか?

これは通常、必要なヘッダー ファイルをインクルードし、適切なライブラリとリンクすることによって実現されます。

スタティック ライブラリとリンクする簡単な例は、次のfooようになりますgcc main.cpp -o main.o -L/folder/where/foo.a/is/at -lfoo

ほとんどのオープン ソース プロジェクトには、より詳細な手順が記載された readme があります。ある場合は参照することをお勧めします。

于 2010-01-22T20:11:27.587 に答える
4

[ライブラリ] を書くことは、main() 関数を除いて、通常の C++ プログラムと何か違うのですか?

それは、「異なる」の定義によって異なります。言語の観点からは、ファイルまたはファイルのコレクションを作成し、ファイルを配置せずmain()、実行可能ファイルの代わりにライブラリを生成するようにコンパイラに指示します。

ただし、ライブラリを呼び出すコードを制御できないため、ライブラリの設計ははるかに困難です。ライブラリは、通常のコードよりも障害に対して堅牢である必要があります。delete誰かがあなたの関数に渡すポインターは必ずしもそうではありません。どのマクロがコードを台無しにするかはわかりません。また、誤ってグローバル名前空間を汚染することもありません (たとえばusing namespace std、ヘッダー ファイルの先頭に配置しないでください)。

コンパイルされたプログラムはどのようにしてライブラリになりますか? これは明らかに実行可能ファイルではありません。たとえば、'test.cpp' を 'test.dll' に変換するにはどうすればよいでしょうか?

それはコンパイラに依存します。Visual C++ では、これはプロジェクトの構成設定です。gcc(メモリから)では、gcc -c foo.c -shared.

フォーマットを取得したら、それを別のプログラムに含めるにはどうすればよいですか?

これは、コンパイラとリンカーによって異なります。プロジェクト設定または環境変数を介してヘッダー ファイルが利用可能であることを確認し、別のプロジェクト設定またはコンパイラ変数を介してバイナリが利用可能であることを確認します。

それらを配置する標準的な場所はありますか?それにより、必要なコンパイラ/リンカーが簡単に見つけることができますか?

これは、オペレーティング システムによって異なります。UNIX では、 、 などの場所に配置し/usr/libます/usr/local/lib。Windows では、人々は DLL を次のような場所に配置してC:\WINDOWSいましたが、それはもはや許可されていません。代わりに、プログラム ディレクトリに配置します。

動的ライブラリと静的ライブラリの (技術的および実際的な) 違いは何ですか?

静的ライブラリは、より簡単なオリジナル モデルです。コンパイル時に、リンカーはライブラリのすべての関数を実行可能ファイルに入れます。ライブラリが組み込まれているため、ライブラリなしで実行可能ファイルを出荷できます。

動的ライブラリ (共有ライブラリとも呼ばれます) では、実行時にリンカが正しいライブラリを見つけてそこにあるメソッドを呼び出すことができるように、コンパイラが実行可能ファイルに十分な情報を配置します。ライブラリは、それらを使用するプログラム間でシステム全体で共有されます。動的リンク (dlsym()など) を使用すると、画像にいくつかの詳細が追加されます。

コードでサードパーティのライブラリを使用するにはどうすればよいですか (MySql C++ コネクタの .dylib および .a ファイルを見つめています)

それはプラットフォームによって異なります。残念ながら、.dylib ファイルについてはあまり説明できません。.a ファイルは静的ライブラリであり、gcc への最後の呼び出しにそれらを追加するだけです (gcc main.c foo.a -o main場所がわかっている場合foo.a、またはgcc main.c -lfoo -o mainシステムがfoo.afoo.la、または場所を知っている場合foo.so)。一般に、コンパイラーがライブラリーを見つけて、残りの作業をリンカーに任せることができるようにします。

于 2010-01-22T20:34:33.440 に答える
1

私はこれを、技術的に正しいというよりも実用的に書くために書いています。あなたが何を求めているかについての一般的な考えをあなたに与えるには十分です.

main() 関数を除いて、通常の C++ プログラムとは違うものを書いていますか?

静的ライブラリの場合、実際には大きな違いはありません。

動的ライブラリの場合、注意する必要がある可能性が最も高い違いは、ライブラリの外で使用できるようにするシンボルをエクスポートする必要がある場合があるということです。基本的に、エクスポートしないものはすべて、ライブラリのユーザーには見えません。正確にエクスポートする方法、およびデフォルトで必要かどうかは、コンパイラによって異なります。

動的ライブラリの場合、すべてのシンボルを解決する必要もあります。つまり、ライブラリは、ライブラリの外部からの関数や変数に依存できません。ライブラリで foo() という関数を使用している場合、foo() を自分で作成するか、foo() を提供する別のライブラリにリンクして、ライブラリに含める必要があります。私は foo() を使用できず、ライブラリのユーザーがそれを提供すると想定しています。リンカーは、まだ存在しない foo() を呼び出す方法を知りません。

コンパイルされたプログラムはどのようにしてライブラリになりますか? これは明らかに実行可能ファイルではありません。たとえば、'test.cpp' を 'test.dll' に変換するにはどうすればよいでしょうか?

これは、test.cpp を test.exe に変換する方法 (コンパイルとリンク) に似ています。コンパイラにオプションを渡して、実行可能ファイル、静的ライブラリ、動的ライブラリのいずれを作成するかを指示します。

フォーマットを取得したら、それを別のプログラムに含めるにはどうすればよいですか?

ソース コードには、ライブラリに含まれていないコードのヘッダー ファイルを含めるのと同じように、ライブラリを使用するために必要なヘッダー ファイルを含めます。また、リンク行にライブラリを含めて、ライブラリの場所をリンカに伝える必要があります。多くのシステムでは、動的ライブラリを作成すると、共有ライブラリとリンク ライブラリの 2 つのファイルが生成されます。リンク行に含めるのはリンク ライブラリです。

それらを配置する標準的な場所はありますか?それにより、必要なコンパイラ/リンカーが簡単に見つけることができますか?

ライブラリを探す場所をリンカに指示する環境変数があります。その変数の名前は、システムごとに異なります。リンカーに追加の検索場所を伝えることもできます。

動的ライブラリと静的ライブラリの (技術的および実際的な) 違いは何ですか?

静的ライブラリは、リンク先のものにコピーされます。実行可能ファイルには静的ライブラリのコピーが含まれ、静的ライブラリをコピーしなくても別のマシンで実行できます。

動的ライブラリは別のファイルに残ります。実行可能ファイルは、実行時にその別個のファイルをロードします。動的ライブラリのコピーをプログラムと共に配布する必要があります。配布しないと実行されません。動的ライブラリを新しいバージョンに置き換えることもできます。新しいライブラリが同じインターフェイスを持っている限り、古い実行可能ファイルで引き続き実行されます。また、複数の実行可能ファイルが同じ動的ライブラリを使用する場合、スペースを節約できます。実際、動的ライブラリは共有ライブラリと呼ばれることがよくあります。

コードでサードパーティのライブラリを使用するにはどうすればよいですか

上記のように、自分で作成したものを使用するのと同じです。

于 2010-01-22T20:15:05.533 に答える
1

静的ライブラリと動的ライブラリの違いは、静的ライブラリの場合はコンパイル時にリンクが実行され、実行可能コードがバイナリに埋め込まれますが、動的ライブラリの場合はリンクがプログラムの開始時に動的に行われることです。利点は、ライブラリを個別に配布、更新できること、およびコード (メモリ) を複数のプログラム間で共有できることです。

ライブラリを使用するには、lib.a または lib.so の g++ に -l を指定するだけです。

于 2010-01-22T20:06:19.860 に答える