.dll
または.so
一方で、(実行時にリンク)LIBSを共有している.a
と、.lib
静的ライブラリ(コンパイル時にリンク)があります。これはWindowsとLinuxの違いではありません。
違いは、それらがどのように処理されるかです。注:違いは税関のみで、どのように使用されているかです。LinuxをWindowsでビルドしたり、その逆を行ったりすることは、実際に誰もこれを行わないことを除いて、それほど難しくありません。
dllを使用する場合、または独自のバイナリからでも関数を呼び出す場合、シンプルで明確な方法があります。たとえば、Cでは次のようになります。
int example(int x) {
...do_something...
}
int ret = example(42);
ただし、asmレベルでは、多くの違いがある可能性があります。たとえば、x86では、call
オペコードが実行さ42
れ、スタックに与えられます。または一部のレジスター。またはどこでも。dllを作成する前に、それがどのように使用されるかは誰にもわかりません。または、プロジェクトがそれをどのように使用するか、現在では存在しない(またはdllの開発者にとっては不明な)コンパイラー(または言語で!)
たとえば、デフォルトでは、CとPascalの両方が引数をスタックから(そして戻り値を)取得しますが、それらは異なる順序で実行されます。コンパイラー依存の最適化によって、レジスター内の関数間で引数を交換することもできます。
ご覧のとおり、Windowsのカスタムはdllを構築することであり、最小限の.a
/ .lib
を作成します。この最小限の静的ライブラリはラッパーにすぎず、そのdllのシンボル(関数)はそこから到達します。これにより、必要なasmレベルの呼び出し変換が行われます。
その利点は互換性です。その不利な点は、.dllしかない場合、その関数の呼び出し方法を理解するのに苦労する可能性があることです。これにより、DLL の開発者から提供されない場合に、.a
DLLの使用がハッキングタスクになります。したがって、これは主にクローズドな目的に役立ちます。たとえば、SDKの追加の現金をより簡単に取得できます。
そのもう1つの欠点は、動的ライブラリを使用する場合でも、この小さなラッパーを静的にコンパイルする必要があることです。
Linuxでは、dllのバイナリインターフェイスは標準で、Cの規則に従っています。したがって、.a
必要なものはなく、共有ライブラリ間にはバイナリ互換性がありますが、マイクロソフトカスタムの利点はありません。