質問: unix上c++でのdllとインポートライブラリの関係 こんにちわ。 いつも教えてgooにお世話になっているorange_pieです。 unix上のc++で作成した自作ライブラリをdllにして配布したいのですが、 unixでの基本的な考え方を教えてください。 (1)unix上ではdllの標準的な名称は”libxxxx.so”とするのが普通ですか? ※この形式ならld_library_path環境変数が検索してくれる。。。 (2)通常、dllにする場合、インポートライブラリ(.lib)と実際のライブラリ(.so)を作成して、使用する側はインポートライブラリのみをリンクするのでしょうか? (3)配布されたdllを使う側では、link時にインポートライブラリをリンクして、関連インクルードファイルをインクルードするだけで使えるのでしょうか? (4)上記の(2)のように、インポートライブラリとライブラリの実態を作成する為のコンパイルオプションが見つかりません。(ldのmanを見たのですが、意味がわからないと言うか。。。。。) この質問は、自作ライブラリからlibxxx.soという形のオブジェクトファイルを作り、別プログラムからこのlibxxxをコンパイルオプション(-l)でリンクしてみたら正しく動作したのですが、これでは結局ライブラリの本体が一緒にリンクされている様子で、出来上がった実行形式のファイルサイズが静的ライブラリとしてリンクした時と同じ大きさになっていることに疑問を抱いてしまったものです。 この状態でも、ライブラリの方だけコンパイルしなおして実行すると ちゃんとライブラリの変更点は反映されるので問題は無いのですが、 これでもダイナミックリンク・ライブラリと呼べるのでしょうか?
回答: # すっごく暇ってわけではないんですが :-) > -wl,-b,dynamic -lclntsh -ldl -lm -lnsl -lsocket -lrt -lpthread > > この中の”-b, dynamic ”の辺りが「ライブラリをダイナミックにリンクするよ」ってことだったのでしょうか? man ld の -l と -b のところを読めば分かると思いますが、大体、そういうことです。 -b dynamic の場合(普通は、こっちがデフォルト)には -lxxx の指定で libxxx.so を探して、無ければ、libxxx.a を探します。-b static の場合には libxxx.so を 対象にしません。 参考urlには solaris の answerbook を紹介しておきます。 > ということも考慮に入れると、arコマンドで作ったアーカイブもdllもリンクオプションで-b dynamic とすれば、実行時にリンクできる。(のかな?) いやいや。静的なライブラリ、っつう位ですから、静的なリンクにしか使え ません。 .a も .so も「ライブラリ」って名前がつきますけれど、.a はアーカイブファイル なので、tar の出力ファイルの方に似ています。.so の方は、実行形式のヘッダを 持ち elf というフォーマットのファイルで実行バイナリの方に似ています。 > で、他人に提供するのにアーカイブとdllのどちらが適しているかというと、 > 関数などが増えた場合以外はどちらでも同じ(という感じ?なのかな?) その「他人」の環境次第なんですが、相手の os やバージョンが特定できないと 静的なアーカイブの方が、利用できる可能性が少し広いです(ソース提供には 遠く及ばないですが)。 > arコマンドは、複数のオブジェクト(.o)を追加することで作成しなおすことができるが、dllはライブラリ構成プログラムをリコンパイルする必要がある。 リコンパイルではなく、再リンクです。 後、共有ライブラリの場合には、あまり小さく刻んでしまうとロードの時間が 気になり出すので、ひとつのファイルの単位をどうするかを悩むときがあり ます。 最後に、no.2 の回答にあるように unix をひと括りにして、.so が普通、と 言うのは、ちょっと大雑把すぎました。他の質問のことが頭にあったもので orange_pie さんが使っている環境を暗に想定してました。 十年くらいさかのぼっただけで共有ライブラリが扱えない unix なんてのは、 ごろごろしてましたし。 参考url:http://docs.sun.com:80/ab2/coll.153.4/refman1/@ab2pageview/116238?ab2lang=ja&ab2enc=shift_jis