ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: C++ ユーザーズガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
動的 (共有) ライブラリの構築方法は、コマンド行に -xar の代わりに -G を指定することを除けば、静的 (アーカイブ) ライブラリの場合と同じです。
ld は直接使用しないでください。静的ライブラリの場合と同じように、CC コマンドを使用すると、必要なすべてのテンプレートインスタンスがテンプレートリポジトリからライブラリに組み込まれます (テンプレートを使用している場合)。アプリケーションにリンクされている動的ライブラリでは、すべての静的コンストラクタは main() が実行される前に呼び出され、すべての静的デストラクタは main() が終了したあとに呼び出されます。dlopen() で共有ライブラリを開いた場合、すべての静的コンストラクタは dlopen() で実行され、すべての静的デストラクタは dlclose() で実行されます。
動的ライブラリを構築するには、必ず CC に -G を使用します。ld (リンクエディタ) または cc (C コンパイラ) を使用して動的ライブラリを構築すると、例外が機能しない場合があり、ライブラリに定義されている大域変数が初期化されません。
動的 (共有) ライブラリを構築するには、 CC の -Kpic や -KPIC オプションで各オブジェクトをコンパイルして、再配置可能なオブジェクトファイルを作成する必要があります。次に、これらの再配置可能オブジェクトファイルから動的ライブラリを構築します。予期しないリンクエラーが出る場合は、-Kpic や -KPIC でコンパイルしていないオブジェクトがある可能性があります。
ソースファイル lsrc1.cc と lsrc2.cc から作成するオブジェクトファイルから C++ 動的ライブラリ libfoo.so を構築するには、次のようにします。
% CC -G -o libfoo.so -h libfoo.so -Kpic lsrc1.cc lsrc2.cc
-G オプションは、動的ライブラリの構築を指定しています。-o オプションは、ライブラリのファイル名を指定しています。-h オプションは、共有ライブラリの内部名を指定しています。-Kpic オプションは、オブジェクトファイルが位置に依存しないことを指定しています。
CC -G コマンドは -l オプションをリンカー ld に渡しません。初期化順序が必ず正しくなるようにするには、共有ライブラリに自らが必要とするほかの各共有ライブラリとの明示的な依存関係を設定する必要があります。依存関係を作成するには、該当するライブラリごとに -l オプションを使用します。標準的な C++ 共有ライブラリは、次の一群のオプションのうち 1 つを使用します。
-lCstd -lCrun -lc -library=stlport4 -lCrun -lc
必要とされるすべての依存関係をリストしたことを確認するには、-zdefs オプションを指定してライブラリを構築します。不明のシンボル定義ごとに、リンカーはエラーメッセージを生成します。不明の定義を指定するには、それらのライブラリに -l オプションを追加します。
不要な依存関係を含んでいるかどうか検索するには、次のコマンドを使用します
ldd -u -r mylib.so ldd -U -r mylib.so
その後、不要な依存関係を除外し、mylib.so を再構築できます。