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

このQ&Aに関連する最新のQ&A

A 回答 (2件)

そのとおりです。

間接的にリンクできる関数はDLLにあって、実行時にリンクすることがあります。DLLの関数群を直接コールすることもできるはずですが、それらの関数をコールするための手続きをインポートライブラリとして用意しておくことが多いようです。

どうも、間違ってはいないんだけど、いまいちつかめないといった感じですね。

実行ファイルの中に入っているのが直接リンクした関数で、実行時にリンクされるのが間接的にリンクする関数と言うことになるでしょう。

C++ Builder5のことはよくわかりません。ごめんなさい。
    • good
    • 0
この回答へのお礼

お礼が遅れまして申し訳ありません。
どうもありがとうございました。
ところで、antigenさんとhorusさんは同一人物でいらっしゃるのでしょうか。
(今回の回答が前回の補足の回答であるような感じがしましたので)
インポートライブラリとは、スタティックリンク時の手続きを書き込むファイルということですね。

お礼日時:2001/02/16 10:36

あなたが言っている通りライブラリです。



外部DLLを使う時はもちろん必要ですが
#この時は、どういったDLLに必要とするライブラリが
#あるのかの情報が記されている。

実行ファイルに直接リンクする関数

たとえば、
fopen()
printof()
など
のライブラリ郡だったりします。

言い替えれば、オブジェクトファイル(.o)の塊
だと思ってください。

これがないと、あなたは普段何気に使っている
fopen,printfなど自分で作らないと使えないことになりますよ

この回答への補足

御返事ありがとうございました。
初心者ですのでよく分からないので、追加で質問させて
頂きたいのですが、「実行ファイルに直接リンクする関数」というのはどういう意味なのでしょうか。
直接リンクする関数と、間接的にリンクする関数が
存在するのですか?。
インポートライブラリの役割としては
(1)間接的にリンクする時の仲介役
(2)そのものが関数ファイル
の2つがあるということになるのですか。
もう一つお聞きしたいのですが、C++ Builder5で
外部DLLを使用する時に、Implibというコマンドを使用
しないといけないそうですが、この使用方法がよく
分かりませんので教えていただけないでしょうか。
どうか御回答を宜しくお願いします。

補足日時:2001/02/02 22:47
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QUnix上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)でリンクしてみたら正しく動作したのですが、これでは結局ライブラリの本体が一緒にリンクされている様子で、出来上がった実行形式のファイルサイズが静的ライブラリとしてリンクした時と同じ大きさになっていることに疑問を抱いてしまったものです。
 この状態でも、ライブラリの方だけコンパイルしなおして実行すると
ちゃんとライブラリの変更点は反映されるので問題は無いのですが、
これでもダイナミックリンク・ライブラリと呼べるのでしょうか?

こんにちわ。
いつも教えてgooにお世話になっているorange_pieです。
UNIX上のC++で作成した自作ライブラリをdllにして配布したいのですが、
Unixでの基本的な考え方を教えてください。

(1)Unix上ではDLLの標準的な名称は”libxxxx.so”とするのが普通ですか?
 ※この形式ならLD_LIBRARY_PATH環境変数が検索してくれる。。。
(2)通常、DLLにする場合、インポートライブラリ(.lib)と実際のライブラリ(.so)を作成して、使用する側はインポートライブラリのみをリンクするのでしょうか?
(3)配布されたdll...続きを読む

Aベストアンサー

# すっごく暇ってわけではないんですが :-)

> -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

# すっごく暇ってわけではないんですが :-)

> -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 を
対象にしません。...続きを読む

QDLLでLIBファイルが作成されない

DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。

1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。

と警告が出てしまいます。

私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。

どのようにしたらLIBファイルが作成されるようになるのでしょうか?

■■■stub.h■■■

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

typedef int (*HOGEHOGE)(int i);

EXPORT class DDDClass{
private:
int num;
HOGEHOGE c;
public:
DDDClass();
int CALLBACK counter();
int CALLBACK touroku(int (*b)(int i));
};

■■■stub.cpp■■■

#include <windows.h>
#include "Stub1.h"

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){
return true;
}

EXPORT class DDDClass;

DDDClass::DDDClass(){
num =0;
c = NULL;
}

int CALLBACK DDDClass::touroku(int (*b)(int i)){
c = b;
return 0;
}


int CALLBACK DDDClass::counter(){

//c = b;
c(num);
num++;
return 0;
}

/*
EXPORT bool CALLBACK aaaaa(){
return true;

}
*/

DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。

1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。

と警告が出てしまいます。

私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。

ど...続きを読む

Aベストアンサー

__declspecの挿入位置が悪いのだと思います

class __declspec(dllexport) クラス名 {
// クラス定義の内容
};

といった具合に classとクラス名の間に __declspecが無いといけません
リンケージ指定の extern "C"は classより前にある必要があります

ですから EXPORTのみで両方をマクロ定義するのはちょっと無理がありそうです

それとstub.cppの
> EXPORT class DDDClass;
これは どんな意図でしょう クラスのインスタンスをエクスポートしたいのならオブジェクト名が必要だと思います

Qスタティックライブラリファイル作成時のデバッグセッションの実行可能ファイル

VisualC++2008ExpressEditionを使用しています。

スタティックライブラリファイルを作成しようとしているのですが、コンパイルしようとすると、「デバッグセッションの実行可能ファイル」というタイトルのウィンドウが現れ、「デバッグで使用する実行可能ファイル名を指定して下さい。」と出てきます。
libファイルはdllと違いコンパイル時に読み込まれてしまうため、テストしたかったら、EXEファイルをコンパイルして作り直さないといけないと思うのですが、ここでいうデバッグで使用する実行可能ファイルとは、どの様なファイルを指しているのでしょうか?

宜しくお願いします。

Aベストアンサー

ライブラリのプロジェクトがあるソリューションにテスト用のプロジェクトも作ります。
テスト用のプロジェクトをライブラリに依存させます。

Qライブラリ、.libとは?

ライブラリと検索すると、標準ライブラリばかり出てきて「○○.lib」のことがいまいち見えてこないのですが、このファイルはどういったものなのでしょうか。
.h、.c、.cppなどでは代用が利かないものなのでしょうか。

あと、C、C++にはライブラリと言うものがあり、あると便利・・・
というのは何となく分かるのですが、
1.ライブラリを配布しているのをあまり見ませんが、どこかまとまって置いてある場所はあるのでしょうか。
2.あまり記載されている参考書が見当たりませんが、どのように使うものなのでしょうか。
3.「このライブラリはどういうものか覚えていた方がいい」というものはありますでしょうか。

この3点について教えていただけるとありがたいです。
よろしくお願いいたします。

Aベストアンサー

>1.ライブラリを配布しているのをあまり見ませんが、
>どこかまとまって置いてある場所はあるのでしょうか。
なんのライブラリのことでしょうか?
ライブラリとは汎用性の高い関数や機能を再利用可能な形にした物を
言います。これは、目的によってプログラマが作ったり、
既に公開されたりしているものもあります。

>2.あまり記載されている参考書が見当たりませんが、
>どのように使うものなのでしょうか。
ライブラリの作りはそれを使う環境にも依存しますが、
Windows環境の場合、Libファイルにはダイナミックリンクライブラリ
(DLL)とスタティックリンクライブラリという2種類が存在します。
Libファイル(***.lib)はDLLの場合、そのライブラリが提供している
関数の関数名などの外部参照用のデータが入っています。
そして、実行には使用したLIBファイルのバイナリデータが入った
DLLファイル(***.dll)が必要です。
スタティックリンクライブラリのLibファイルは、それ自体に
ライブラリのバイナリが含まれており、使う場合はその使ったアプリ
にバイナリとして埋め込まれます。
なので、実行時にDLLファイルは必要ありません。

>3.「このライブラリはどういうものか覚えていた方がいい」
>というものはありますでしょうか。
ライブラリについては特に覚えることは多くありませんし
自分でライブラリを作るなら覚えて損はありません。
むしろ、覚えなくてはいけないのは、ライブラリにした場合に
どのようなことに注意するかです。
ライブラリの扱いは上には上にも書いたとおり、環境に依存する
ところがあるため、使用する環境に応じてある程度作り方が
違ってきます。

>1.ライブラリを配布しているのをあまり見ませんが、
>どこかまとまって置いてある場所はあるのでしょうか。
なんのライブラリのことでしょうか?
ライブラリとは汎用性の高い関数や機能を再利用可能な形にした物を
言います。これは、目的によってプログラマが作ったり、
既に公開されたりしているものもあります。

>2.あまり記載されている参考書が見当たりませんが、
>どのように使うものなのでしょうか。
ライブラリの作りはそれを使う環境にも依存しますが、
Windows環境の場合、Libファイルに...続きを読む

Qdllかlibか

自作のライブラリの場合は任意で
ユーザーが任意のプラグイン読み込めるアプリなら
プラグインに関してはdllでしょうが

公共的なライブラリについて
動的ロード推奨か、静的リンクでもいいという線引はどのあたりなのでしょうか

現状では

ole32.dll
msimg32.dll
comctl32.dll
comdlg32.dll
dsound.dll
kernel32.dll
shlwapi.dll
shell32.dll
uxtheme.dll

を動的にロードし

winmm.lib
user32.lib
gdi32.lib

を静的にリンクしています。
kernel32とかはさすがに静的リンクでもOKでしょうか?
あるいはwinmmとかは動的な方がいいでしょうか?

なお、対象はWindowsでXP以降とする場合、です。
(Windows以外の場合も教えていただけるとより良いですが)

あと、dsound.dll
とかについてですが

DirectSoundCreate8
だけGetProcAddressすれば

あとの

struct IDirectSound8;
struct IDirectSoundBuffer8;

のメンバなどについてはGetProcAddressしなくても使えるようだし
リンクエラーにならないのですが、これはどんな感じの仕組みになっているのでしょうか?

あるいは、それを気にしなくてもこれは「そうやっておけば問題ない」
としておいてもいいようなものなのでしょうか?

自作のライブラリの場合は任意で
ユーザーが任意のプラグイン読み込めるアプリなら
プラグインに関してはdllでしょうが

公共的なライブラリについて
動的ロード推奨か、静的リンクでもいいという線引はどのあたりなのでしょうか

現状では

ole32.dll
msimg32.dll
comctl32.dll
comdlg32.dll
dsound.dll
kernel32.dll
shlwapi.dll
shell32.dll
uxtheme.dll

を動的にロードし

winmm.lib
user32.lib
gdi32.lib

を静的にリンクしています。
kernel32とかはさすがに静的リンクでもOKでしょうか?
あるいはwinmmと...続きを読む

Aベストアンサー

#1です。#1に書いた補足の所の回答をします。

・実行速度の件
アセンブラコードを見ると判るのですが、動的リンクの場合は、DLLに対応するジャンプテーブルが、コード領域の最後に作られるらしく、一度そちらにジャンプしてからDLLのコードに飛んでいきます。
それに対して、(実証したことがないので推測ですが)静的リンクの場合は自EXE内に既にコードが展開されるので、直接ジャンプしているものと推測しています。(どこにあるか判るのでジャンプテーブルは必要ないはず)
なので、若干静的リンクが早いとは思いますが、正直ループで1万回まわしてどれだけ差が出るの?って感じ程度だと思います。
キャッシュミスを考えても、そもそもコード量>1次命令キャッシュがほとんどですから、どっちにしろコード量が大きければ、静的リンクも動的リンクも同じくらいヒットしたりミスしたりするとおもいますが。
動的DLL部分だから違うキャッシュ空間を使う、というわけでもありませんからね。DLLのコードの位置が、ちょっと離れているか、自EXE内にあるか、というだけで、そもそもキャッシュは関数レベルでリードしているわけではありませんから、どっちもどっちかと思いますよ。
ただ、前述のジャンプテーブルの分だけ、動的リンクの方がキャッシュを使いつぶしやすいでしょうけど。

・アップグレード権うんぬんの話
これについては、たしかにインストール時に必要なパッチをインストールさせる手もありますね。
ただし、そのEXEをCDやDVDに入れないといけないですが。
また、そこに至るまでの前提パッチ全て入れる必要もあります。
(このあたりのパッチの依存関係を調べるのは大変じゃないですかね・・・?)

・TrackMouseEventの件
さすがに、プラットフォームSDKのヘッダに記載されている名称そのままはぶつかりますので使えません。
ですが、LoadLibraryとGetProcAddress()を使っているなら、その取得したアドレスをポインタに格納すれば名称変更で同じことができると思いますが。
  typedef BOOL (*LOADADDR_TRACKMOUSEEVENT)( LPTRACKMOUSEEVENT lpEventTrack );

  LOADADDR_TRACKMOUSEEVENT pTrackMouseEvent = (LOADADDR_TRACKMOUSEEVENT )GetProcAddress(~);

  LPTRACKMOUSEEVENT event;
  BOOL brc = pTrackEvent( &event );

こんな感じでいけると思います。これで、”TrackMouseEvent”を、”pTrackMouseEvent”と置換するだけで済むかと。


・#2さんのお礼の所にあったLIBの話
自分の所ではないのですが、思ったことが1つあったので、書いておきます。

たしかに、libの中にコードが入っているコンパイラもあります。
私も使ったことはあります。自分の担当分をlib化してコードを1つにしておいて、後で他人の作ったLIBと合わせて1本にする、という用法です。

ただし、Windowsの開発環境の場合は、LIBにコードは含まれていないはずなのですが。
主さんがLIB=静的リンク、と言っているのは、上記の通り、そういう環境で開発したことがあるからではないかな、と推測しますが、どうでしょうか?

私が認識している感じでは、winmm.lib等、プラットフォームSDKに入っているlibは、あくまでこれに対応するDLLに格納している関数名とその引数の数やオフセットアドレス位しか格納していないと思いました。

なので、まとめてしまうと、Windowsの場合に限っていえば、静的リンクはDLLのコードごとEXEに組み込むことを指し、動的リンクはEXE実行時にDLLをロードして使う(LIBを使ってコンパイル・リンクして、自動でロードさせる)、または、EXE側でLoadLibrary+GetProcAddressで使うことを指す、ということになります。

なお、#pragma comment( lib, "winmm.lib" )は、主さんの書いている通り、追加の依存関係に書くのと同じです。
(なので、私も1箇所でしか使っていない場合とか、他人に流用させることを意識したソースコードの場合は#pragmaを使います)

・必要DLLが無い環境でのEXE実行の件
d3dx9.dllの話を出していますが、主さんの書いており通り、d3dx9.libに対応するDLLがなければEXEは起動できませんので、通常はこのDLLが無い環境にインストールされるかもしれないと想定される場合は、インストーラーでインストールして導入させる必要があります。

何でもいいのですが、アプリをインストールしていて、インストーラーからインストーラーを起動する光景をみたことはありませんか?
もしくは、ゲームのインストーラーに必ずと言って良い位、DirectXのインストーラーもついて来ます。これを入れないと動かないぞと言わんばかりです。
つまり、導入しないなら使えない、使いたいなら前提となるDLLをインストールしてください、というのが動的リンクを使ったEXEを使う場合の前提です。ただし、これをやると以降のバージョンUPの際は、EXE入れ替えのみで済むという手抜きアップグレードができたりします。(普通やらないでしょうけど)
これがいやな場合は、静的リンクにするしかありません。無いものは自前で用意する、という感じですね。

・静的リンクのアプリの作り方
すいませんが、静的リンクはMFCでしかやったことがないので、他のDLLの静的リンクの方法はわかりません。
MFCのDLLの場合は、プロジェクト設定時に指定できるので、スイッチポンで指定できるのですが・・・他のは設定がありませんね。もしかしたら、自分でリンカの所にオプションを追加するのかもしれません。

#1です。#1に書いた補足の所の回答をします。

・実行速度の件
アセンブラコードを見ると判るのですが、動的リンクの場合は、DLLに対応するジャンプテーブルが、コード領域の最後に作られるらしく、一度そちらにジャンプしてからDLLのコードに飛んでいきます。
それに対して、(実証したことがないので推測ですが)静的リンクの場合は自EXE内に既にコードが展開されるので、直接ジャンプしているものと推測しています。(どこにあるか判るのでジャンプテーブルは必要ないはず)
なので、若干静的リンクが早いとは...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報