22

Xcode で C++ ライブラリを作成しようとしていますが、C/C++ ライブラリと STL C++ ライブラリのどちらのオプションを選択すればよいかわかりません。STL C++ Libraryこのオプションでは静的ライブラリを作成できず、動的ライブラリを強制的に作成できないことに気付きました。ただし、このC/C++ Libraryオプションを使用すると、静的ライブラリを作成するだけでなく、動的ライブラリを作成することもできます。

これら 2 つのオプションの違いは何ですか? また、それぞれをいつ使用する必要がありますか? オプションの下の説明を読みましたが、残念ながらあまり役に立ちません。

別の注意として、静的ライブラリ ファイルが動的ライブラリ ファイルとまったく異なるのはなぜですか? 違いは、ライブラリ自体の機能やコードではなく、主にライブラリの検索方法 (アプリと共にパッケージ化されるか、ターゲット マシン上の存在に依存するか) にあるようです。誰かがこれを明確にすることができれば素晴らしいでしょう。

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

19

静的にリンクされたライブラリは実行時にロードできませんが、実行可能ファイルをリンクするときにバイナリファイルに組み込む必要があります。これは、静的にリンクされたライブラリ内のコードへのすべてのエントリポイントが明確に定義されており、それらのアドレスが実行可能コードの先頭に対して変更されないことを意味します(したがって「静的」)。

動的にロードされるライブラリでは、コードがどこにあるかを知る方法がないため、ライブラリが実行時にロードされる場合、ロードされたコードを「バインド」するには、ある程度のパフォーマンスオーバーヘッドが必要です。基本的に、リンクは実行時に延期されます。そのため、「遅延バインディング」とも呼ばれます。

どちらを実装するかは、使用要件によって異なります。ユーザーが依存関係を気にせずにアプリケーションフォルダーにドラッグアンドドロップするだけの自己完結型の実行可能ファイルが必要な場合は、ライブラリを静的にリンクすることをお勧めします。

ただし、大規模なプロジェクトの場合、大量の機能を提供するアプリでは、すべての機能を一度にロードすることは法外で不要な場合があります。動的にロード可能なライブラリのセットを提供すると、メモリを節約し、起動時間を短縮できます。次に、ユーザーが機能にアクセスすると、関連するコードがロードされ、しばらく使用されていない機能をアンロードできる可能性があります。

さらに、コードに変更を加えた場合、実行可能ファイル全体を再コンパイルして再リンクして再配布するのではなく、1つまたは2つのライブラリを再配布するだけでよい場合があります。そして、プラグインの見通しについて言及する必要がありますか?

上記の2つのテンプレートの違いは微妙です。どちらもGNU99標準に従ってCをコンパイルします。ただし、C / C ++ライブラリテンプレートは、C ++ / GNU++0xの「標準」に従ってC++をコンパイルするようにxcodeを設定します。C ++ / GNU ++ 0xは、2011年にC ++ / GNU ++11として正式に公開されました。どちらのテンプレートもデフォルトでlibc++を使用しますが、STL C ++テンプレートでは、代わりに古いlibstdc++に対してリンクすることを選択できます。なぜあなたはこれをしますか?コードがlibc++に対してリンクしているが、libstdc ++を参照する他のライブラリに対してもリンクしていて、競合するシンボルに遭遇した場合は、代わりにlibstdc++に対してリンクすることでこれを解決できる可能性があります。STL C ++ライブラリテンプレートを使用すると、コンパイラがGNU++11拡張機能を除くC++11標準に準拠するように要求したり、C ++ / GNU ++ 98に戻るように要求したりすることもできます(レガシーコードをコンパイルする必要がある場合は、

于 2012-11-13T10:30:20.887 に答える