• ベストアンサー

ライブラリ、.libとは?

ライブラリと検索すると、標準ライブラリばかり出てきて「○○.lib」のことがいまいち見えてこないのですが、このファイルはどういったものなのでしょうか。 .h、.c、.cppなどでは代用が利かないものなのでしょうか。 あと、C、C++にはライブラリと言うものがあり、あると便利・・・ というのは何となく分かるのですが、 1.ライブラリを配布しているのをあまり見ませんが、どこかまとまって置いてある場所はあるのでしょうか。 2.あまり記載されている参考書が見当たりませんが、どのように使うものなのでしょうか。 3.「このライブラリはどういうものか覚えていた方がいい」というものはありますでしょうか。 この3点について教えていただけるとありがたいです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

>1.ライブラリを配布しているのをあまり見ませんが、 >どこかまとまって置いてある場所はあるのでしょうか。 なんのライブラリのことでしょうか? ライブラリとは汎用性の高い関数や機能を再利用可能な形にした物を 言います。これは、目的によってプログラマが作ったり、 既に公開されたりしているものもあります。 >2.あまり記載されている参考書が見当たりませんが、 >どのように使うものなのでしょうか。 ライブラリの作りはそれを使う環境にも依存しますが、 Windows環境の場合、Libファイルにはダイナミックリンクライブラリ (DLL)とスタティックリンクライブラリという2種類が存在します。 Libファイル(***.lib)はDLLの場合、そのライブラリが提供している 関数の関数名などの外部参照用のデータが入っています。 そして、実行には使用したLIBファイルのバイナリデータが入った DLLファイル(***.dll)が必要です。 スタティックリンクライブラリのLibファイルは、それ自体に ライブラリのバイナリが含まれており、使う場合はその使ったアプリ にバイナリとして埋め込まれます。 なので、実行時にDLLファイルは必要ありません。 >3.「このライブラリはどういうものか覚えていた方がいい」 >というものはありますでしょうか。 ライブラリについては特に覚えることは多くありませんし 自分でライブラリを作るなら覚えて損はありません。 むしろ、覚えなくてはいけないのは、ライブラリにした場合に どのようなことに注意するかです。 ライブラリの扱いは上には上にも書いたとおり、環境に依存する ところがあるため、使用する環境に応じてある程度作り方が 違ってきます。

sirooni
質問者

お礼

ありがとうございます。 大体アウトラインが見えてきました。 幾つか気になるキーワードを頂いたので、後は自分で調べて、使うかはそれから考えようと思います。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

Windowsの場合ですが例えばzip圧縮ファイルを読み書きしたいという場合にzlib.dllを使うと便利です。 自分のプログラムで"zlib.h"をインクルードして"zlib.lib"をリンクすれば"zlib.dll"の中の関数が使えるという感じです。

sirooni
質問者

お礼

ありがとうございます。 なるほど、.hと.libと.dllはそういう関係だったんですね。 分かりやすいです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

バイナリで配布しているライブラリについては環境に依存した話になります。環境を補足してください。 環境に依存しない、あるいは何種類かの環境に対応したライブラリの場合、配布はソースファイルで行い、ユーザーが自分の環境に応じてコンパイルすることが多いかと思います。

sirooni
質問者

補足

申し訳ないです。 うっかり忘れてました。 大概はXP、VC++6.0などを使用いたします。 最近VisualStudioを購入したので乗り換えるつもりです。 あと、3点についてじゃないですね。 誤植多くてすみません。

関連するQ&A

  • *.libを作成する方法

    自作のC++のライブラリを使おうとしましたが、 ある環境で、Cしかコンパイルできない環境だったので、 C関数でワンクッションおいた、Cのライブラリを作りたいのです。 しかし、libファイルの作り方がわかりません。 makeとかで作る方法が知りたいです。 C++のライブラリは、統合環境で作成したライブラリです。 そのライブラリ名はMyCPP.libとし、ヘッダはMyCPP.hppとします。 ワンクッション用のファイルは one.cppとし、ヘッダはone.hとします。 *** one.cpp int c_add(int a, int b) { MyCPP x return x.Add(a, b); } *** one.h extern "C" { int c_add(int a, int b); } cl one.cppとすると、エントリポイントがありませんと表示されます。 目的は one.libを作成したいです。

  • .objファイル、.lib ファイルについて

    ◆C++でのコンパイルされたプログラムの参照について。  以前、VB.netで開発をしていた時は、コンパイルをするとDLLが作成され、  それを他のプログラムからリンクして使用していました。  C++の場合h、cppのファイルをコンパイルすると、「.DLL」はできないのでしょうか? ◆.obj、.lib について  Visual Studioにて、.obj、.lib を、参照先に設定していますが、  内容をよくわかっていません。  オブジェクトリンク、ライブラリリンクとは、  (1)それぞれどんな概念なのでしょうか?  (2).obj、.libでは何が違うのでしょうか?

  • 'd3dx9.lib' が開けません。

    DirectXの事で質問があります。 Microsoft Visual C++ 2008 Express Edition で Microsoft DirectX SDK (March 2008)の Matrices.cppというチュートリアルのコードを実行したのですが、 1>LINK : fatal error LNK1104: ファイル 'd3dx9.lib' を開くことができません。 とのエラーがかえってきます。 DirectX エンドユーザー ランタイム (March 2008) も DirectX エンドユーザー ランタイム ウェブインストーラも インストールしましたけれども、解決できません。 ツール オプション で、インクルードファイルとライブラリも DirectX SDK (March 2008)のインクルードとライブラリのパスを指定しました。 プロパティでd3d9.lib d3dx9.lib winmm.libを 追加依存ファイルに設定してます。 それでも、'd3dx9.lib' を開きたくないそうです。 どのようにしたら、Matrices.cppを実行できますでしょうか。 できれば、d3dx9.libも開けるようにしておきたいのですが、 どのようにしたら、d3dx9.libをひらけるようになりますでしょうか。

  • Javaでライブラリのバイナリ配布

    Androidで初めてJavaを使い始めた者です。 javaで作ったライブラリを配布しようと思っておりますが、 C/C++のようにLibファイルのようにバイナリにして ソースコードを隠ぺいして配布することは可能でしょうか? jarファイルにすれば良いのかな?と思ったのですが、 エクリプスでそのまま中身が見れてしまっております。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • スタティックライブラリの使い方

    Linuxで使えるCのライブラリを落としてきたのですが、使ったことがないので戸惑っています。 パッケージは、makefile , .c , .h の3つで、makeするのはできました。で、ライブラリ.a が出力されまして、このファイルを使え!と説明書にはあるのですが、この先がよくわかりません。 とりあえず、出力されたライブラリを/usr/lib あたりに入れて、自作のプログラムで先ほどのライブラリのヘッダをインクロードするところまではできたのですが・・・。 コンパイルすると、/usr/bin/ld: cannot find -ライブラリ と出てしまいます。教えていただけますでしょうか。

  • zlib.libとlibpng.libについて

    zlib.libとlibpng.libの作成ができなくて困っております。 libpng.libでpngAPIを使うには、zlib.libが必要だということで zlib.libのビルドにも挑戦していますがうまくいきません。 これらのファイルを作るのが目的ではないので どなたか配布できるならば配布していただけないでしょうか?。 もし配布できないなら作り方の詳細をご教授願います。 環境 Windows VISTA SP1 Visual Studio 2008 googleで検索して出てきたHPについては ほとんど見ましたが それをみてやっても上記環境ではうまくビルドができません。 *例えば以下 他にもたくさんみてその通りにやりましたが エラーが大量にでてしまいうまくいきません。 http://dencha.ojaru.jp/programs_07/pg_graphic_10a1.html 大変 レベルの低い質問ですがよろしくおねがいいたします。 m(___)m

  • 複数のライブラリをリンクするときに構造体が衝突する

    C++,開発環境はVisual Studio Professional 2013です, ライブラリ1にxy座標の構造体 struct point { int x; int y; }; を定義しています. ライブラリ2にも全く同じ構造体を定義しています. ここで,あるプロジェクトからこれら2つのライブラリをリンクしようとしたら, error C2011: 'point' : 'struct' 型の再定義 というコンパイルエラーが出ます. ライブラリ1とライブラリ2にpoint構造体が記述された共通用のヘッダを参照させるという方法をとれば解決できるのでしょうが,この方法以外でこのエラーをなんとか回避する方法はないでしょうか. 構造体宣言は只の宣言であって実体をもたないため,中身が同じであればいくら記述が重複しても問題はないと聞いたことがあったので大丈夫だと思っていました. また,ライブラリ1とライブラリ2のpoint構造体の名前それぞれpoint1,point2にするなど違うものにするという方法でも回避できるのでしょうが,下記のメインコード内でコメントアウトされている部分のように,構造体の中身が全く同じなので互換性を持たせられるようにしたいのです. ちなみに,ライブラリ1,2はコンソールアプリケーション・空のプロジェクトで作成したあと,ソリューションのプロパティで「構成の種類」を「スタティックライブラリ(.lib)」にするという手順で作成しています. 以下,簡略コード ====ライブラリ1==== ----lib1.h---- #ifndef _H1_ #define _H1_ struct point { int x; int y; }; void print_lib1(struct point p); #endif ----lib1.cpp---- #include "lib1.h" #include <iostream> void print_lib1(struct point p) { std::cout << "lib1 : " << p.x << ", " << p.y << std::endl; } =====ライブラリ2====== ----lib2.h---- #ifndef _H2_ #define _H2_ struct point { int x; int y; }; void print_lib2(struct point p); #endif ----lib2.cpp---- #include "lib2.h" #include <iostream> void print_lib2(struct point p) { std::cout << "lib2 : " << p.x << ", " << p.y << std::endl; } ===メインコード=== ----main.cpp---- #include "../../lib1/lib1/lib1.h" #include "../../lib2/lib2/lib2.h" int main(void) { struct point val; val.x = 2; val.y = 3; print_lib1(val); //print_lib2(val); }

  • C/C++の.libについて教えてください。

    こんにちは。 C/C++のライブラリファイルについて教えてください。 現在VisualStudio2008 AcademicEditionでライブラリを制作しているのですが質問させてください。 ライブラリを制作するプロジェクトをLibA、そのライブラリを利用して実行ファイルを制作するプロジェクトをProjとします。 LibAでother()関数を利用するのに #pragma comment ( lib, "other.lib" )とソースコード上に記述しました。 (other.libは他のプロジェクトで自作したスタティックライブラリでLibAと同じフォルダに入っていると仮定します) ProjでLibAで制作したライブラリを使用するために#pragma comment ( lib, "LibA.lib" )とソースコード上に記述しました。 しかし、other.libが開けませんと怒られてしまいます。 other.libを利用しているのはLibAなのでProj側でother.libを読み込むように強制されるのは面倒臭いのですが、LibA側にother()関数を埋め込むようなことはできないのでしょうか? LibAを利用するProjでもother.libを要求されないようにするにはどうすればいいでしょうか? /* スタティックライブラリを作成するためにLibAをコンパイルする時に#pragma comment ( lib, "other.lib" )の記述が不要というのは知っています。 LibAにその記述を行わなかった場合Projで自分で記述する必要があることも知っています。 */ 現在、私が思いついているのはother.libを作成するプロジェクトのソースコードを引っ張ってきてLibAに入れて一緒にコンパイルするくらいです。 日本語がへたくそでわかりづらいところがあるかとは思いますがよろしくお願いします。

  • ”JvSystemD12R.lib”がみつからない

    エンバカデロのC++ Builder 2009で作成されたサンプルのプロジェクトのフォルダをもらい、中に入っていた *****.groupproj この拡張しのプロジェクトファイルをダブルクリックで起動したところ ”JvSystemD12R.lib”このライブラリがみつからない というメッセージが出てきました。 このJvSystemD12R.libというファイルは、自分のPCにすでにあるライブラリファイルなのでしょうか? このファイルを選択できるようにすればOKでしょうか? ご教授頂きますよう、お願い致します。

  • Macで標準ライブラリのファイル

    Macで標準ライブラリの .cファイルは、どこにあるのでしょうか?? FreeBSDなら/usr/src/lib/libc/~~~ にあるのですが、Macでは見つからないのです。。"find / -name printf.c" などとしてみたのですがヒットせず。 OSのバージョンは10.3です。

専門家に質問してみよう