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 があります。ある場合は参照することをお勧めします。