3

私は主にWindowsで働いていましたが、最近Linuxで働き始めました。私は疑問を持っています。WindowsではVisualStudioをIDEとして使用し、LinuxではMakefileを使用しました。

Windows(VC ++)には、静的ライブラリ(.lib)とDLLの2種類のライブラリがあります。静的リンクを使用しているのか、動的リンクを使用しているのかは明らかです(そうではありませんか?)。

-Bstatic/-staticここで、g ++コンパイラを使用するときに、明示的に言及する必要があるのはなぜBdynamic/-dynamicですか。ファイルが.aファイルの場合は静的リンクを使用する必要があり、ファイルが.soの場合は動的リンクを使用しているためです。

4

4 に答える 4

1

コンパイラーに通常は実行しないことを「強制」したい場合があります。特に-staticは、コードを実行する別のマシンにインストールされていない(または同じバージョンがインストールされていない)ライブラリに対してビルドする場合に役立ちます。

-Bdynamicは、1つのライブラリを静的にリンクしたいが、コードが使用するすべてのライブラリをリンクしたくない場合に便利です。

たとえば、静的gcc -o myprog myprog.o -Wl,-Bstatic -lspecial -Wl,-Bdynamic リンクを使用してリンクします(たとえば、自分で作成したものなど、広く配布されていないものである可能性があります)myproglibspecial

一般的なローカル開発の場合、どちらも必要ありません。

于 2012-12-24T12:38:47.530 に答える
0

ファイルが.aファイルの場合は静的リンクを使用する必要があり、ファイルが.soの場合は動的リンクを使用しているためです。

これらのファイル名の「拡張子」は人間の慣習にすぎません—それぞれである必要がある理由はありませ。当然のことながら、GCCは私たちをその慣習に強制しません。.a.so

于 2012-12-24T13:21:57.283 に答える
0

GNUツールチェーンやその他のUnixコンパイラでは、通常、ライブラリへのフルパスを指定しません。リンカに次のようなフラグを付けます

-lfoo

そして、、、、およびこれらのファイルがどこにあるlibfoo.aかとリンクする必要があるかどうかを判断させます。libfoo.so静的ライブラリのみが利用可能な場合、それはそれにリンクします。

-Bstaticしたがって、いくつかの特定の場合を除いて、実際に指定する必要はありません。動的リンクがデフォルトであり、カスタムライブラリを動的にリンクしたくない場合は、それから構築しない.soでください。

さらに、リンカーに完全なファイル名を指定することで、静的ライブラリと明示的にリンクできます。

gcc -o some_binary main.o libfoo.a

libfooで静的にリンクされた動的にリンクされたバイナリを取得します。

于 2012-12-24T12:41:50.830 に答える
0

私はあなたがそれを逆に持っていると思います。ダイナミックライブラリと静的ライブラリのどちらとリンクしている場合でも、Windowsでは.libファイルが必要です。それらは同じ方法で生成されておらず、同じものを含んでいません。Unixでは、共有オブジェクトとリンクする.soとき、同時に生成される追加のファイルに対してではなく、ファイルに対して直接リンクします。

オプションは、同じディレクトリにaとaの両方が存在する場合-Bstatic-Bdynamicのみ機能します。オプションを使用して指定されたライブラリに対してどちらを選択するかをリンカに指示します。Windowsでは、この状況は発生しません。にはが必要なので、 同じディレクトリに静的にリンクすることはできません。.so.a-l.lib.dll.lib

于 2012-12-24T12:46:23.703 に答える