• ベストアンサー

Unix上C++でのdllとインポートライブラリの関係

a-kumaの回答

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

# すっごく暇ってわけではないんですが :-) > -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
orange_pie
質問者

お礼

本当にお忙しいのに、ありがとうございます。いつもいつも。。。 (。・_・。) >a も .so も「ライブラリ」って名前がつきますけれど、.a はアーカイブファイル >なので、tar の出力ファイルの方に似ています。.so の方は、実行形式のヘッダを 持ち ELF というフォーマットのファイルで実行バイナリの方に似ています。 すばらしいです!!すっきり解決。すんなり納得。もう混乱しません。 どうしたら、こんなに正しい知識を幅広くお持ちになれるんでしょう。。。 もしかして、教授さん? これからは、ぷろくまさんと呼ばせていただきます。(私だけ。) 参考URLは、Solaris上でmanコマンドを叩いたのと同じ情報のようですね。 これなら、いちいちターミナルからSolarisに接続しなくても良いので早速「お気に入り」に入れちゃいました。 本当にありがとうございました。

関連するQ&A

  • C++のdllの作り方を教えてください。

    こんにちは。 先週、「UNIXのC++で共通クラスを作りたい。」って言う質問をした orange_pieと申します。 そのバージョンアップ質問として、作成した共通クラスをDLLにして みんなに提供したいのですが、コンパイルはアーカイブを作る時と どう違うのでしょうか? ちなみに、コンパイルした後でarコマンドを使ってアーカイブを作っていました。 % gcc -c aaa.cpp % ar -r libaaa.a aaa.o dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? また、できあがったdllを使う側では、ヘッダーファイルをインクルードして LIBパスの通ったところにdllを入れておけば良いのでしょうか? どなたか教えてください。

  • DLLとインポート、エクスポート

    環境 Microsoft Visual C++ DLLはWin32 Dynamic-Link Library ExeはWin32 Application で作成しています。 DLLにメッセージボックスを表示するのみの処理の関数があり。 Exe側でその関数を使用したいだけです。 DLLのヘッダファイルにエクスポートしたい関数を _declspec(dllexport) void exportmain(); としています。 Exeではインポートを __declspec(dllimport) void exportmain(); としています。 プロジェクト⇒設定⇒リンクにlibファイルの設定もしています。 dll、libファイルの場所も問題ないと思います。 しかし、ビルドすると「外部シンボル~~未解決です」とエラーがでてしまいます。なにか原因がわかるかたおりましたら、ご教授お願い致します。

  • DLL作成について

    DLL作成の機会がいろいろ調べているのですが、教えていただきたいことがあります。 1.インポートライブラリについて  Windowsで暗黙的リンクでDLLをリンクする場合、  インポートライブラリを利用するようですが、  これは、DLL内のポインタと関数名を紐付けるような  役割だと想定しています。  仮に関数等ヘッダーで公開されている部分以外で  DLLを更新した場合、インポートライブラリも  再リンクするような場面があるのでしょうか。  特に再リンクしなくてもDLLの更新が反映されたので・・ 2.DLLのクラスの継承について  DLL内に作成したクラスを継承することは不可能ですかね。  DLLが更新された場合、インスタンスのイメージが違うため  newやdeleteの処理で当初リンクしたインスタンスのイメージで  行いますよね。

  • Linuxの動的ライブラリをMacで使いたい

    64bit Linux用に提供されたライブラリ(*.a, *.so)をMac(Snow Leopard)で使いたいと思っています。Mac環境でコンパイルをしたところ、リンク時に以下のwarningが出てしまいました。 ld: warning: in xxx.so, file is not of required architecture Webで調査し、gccのオプションに-arch i386 -arch x86_64を付けてみましたが解決できませんでした。そもそも、Linux用のライブラリをMacで使うというのは無理なのでしょうか?ご回答どうぞよろしく御願いいたします。

  • CのDLLをVC++でコンパイルしたいのですが、エラーになってしまいます。

    c言語の初心者なのですが、質問させて下さい。 javaからCのDLLを呼び出したく、 (下記のソースを書いたのですが、VC++でコンパイルすると LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/HelloWorld.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出てしまいます。 過去ログ等を見て、作成しているプロジェクトが悪いのかなと思い、 MFC appWizark(dll) win32 Application win32 Console Application win32 Dynamic-Link Library 等を作ってみてコンパイルしてみたのですが、駄目でした。 ちなみにDOSプロンプトで cl -IC:\j2sdk1.4.2_10\include\win32 -LD HelloWorl d.c -o HelloWorld.dll と実行するときちんとコンパイルできて、正常に実行も出来ました。 VC++でどうやればコンパイルできるのでしょうか? #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_printMessage (JNIEnv *env, jobject me) { printf("Helo World!!!\n"); return; }

  • C++BuilderやDelphiでVC++用のDLLの作成

    C++Builderの画面から新規作成からDLLウィザードを選ぶと、VC++スタイルのDLLを選択して作成できるようになっています。VC++用のDLLを作成出来るとは書かれていません。実際、VC++コンパイラからリンクを拒否されます。 また、VC++用のインポートライブラリをCOFF形式からBorland用のOMF形式に変換するユーティリティCOFF2OMF)は存在していますが、OMF形式をCOFF形式に変換する手法を見かけません。 変換方法を書いているWEBや雑誌記事とかを紹介してください。

  • バージョンの違うライブラリを適宜使い分けたい

    linux上にて、バージョンの異なるライブラリをインストールしております。このライブラリを用いて、コンパイル・実行をする際に、バージョンの違うライブラリを適宜使い分けたいのですが、どのようにすると効率的でしょうか? makeを使ってコンパイルしていますが、コンパイルの際に静的リンクを行うのが良いでしょうか?それとも、動的リンクにしておき、実行時にLD_LIBRARY_PATHを設定しなおして動かすのが良いでしょうか?あるいは、上記以外に方法があればアドバイスをもらえればと思います。

  • DLLについて

    VC++でDLLを作成しようとしているのですがいくつか判らない点があります。 1. スタティックライブラリとスタティックリンクライブラリの違い。この二つの用語の違いが分かりません。 2.VBからVC++で作成したDLLを使用するときには.libファイルは必要ないのでしょうか。使用しなくても、使うことができたので。

  • インポートライブラリ(.lib)ファイルについて

    インポートライブラリファイル(.lib)とは 何を行うファイルなのでしょうか。 外部DLLを使用可能にするためのファイルでしょうか。 libファイルの意味、使用方法を教えてください。

  • DLLの作りかた

    サンプルで配布されたアプリケーションのEXEファイルをDLL化して、自作するアプリケーション上で利用したいと思っています。 DLLってどうやって作成していくのでしょうか? 初心者にとって、この道は険しいでしょうか?