C++での静的ライブラリの作成方法とは?

このQ&Aのポイント
  • C++での静的ライブラリの作成方法とは?ライブラリの構成や作り方、使い方などの基本的なことを教えてください。
  • C++でライブラリのラッパーを作成したい方による質問です。既存ライブラリの構成や作り方、リンクやインクルードの方法など、基本的な疑問について解説してください。
  • C++での静的ライブラリの作成方法はよくわからず、調査している方の質問です。ライブラリのファイル構成や作り方から、インクルードやリンクの方法まで、基本的な知識を教えてください。
回答を見る
  • ベストアンサー

C++での静的ライブラリの作成方法

C++での静的ライブラリの作成方法 今まで独学でC++を勉強してきたのですが、既存ライブラリのラッパーを作りたいと思います そこで、色々なサイトなどで調べてみたのですが、いまいちライブラリというものについて納得の出来る解説のあるサイトが見つからなかったので、質問させて下さい まず私が元にするライブラリの構成は hoge.h foo.lib bar.lib となっており、その関数などを使用する独自型のクラスや、それをさらに扱うクラスなどを作っています その場合、ふたつのクラスをひとつのlibファイルに一緒にしてもいいものなのか、 はたまた分けてそれぞれlibファイルにするのか、 複数できたヘッダはプロジェクトに追加するときどれを入れるのか、 インクルードやリンクはどこに張ればいいのか、 libファイルにヘッダは含まれているのか、など 基本的なことが全然わからず、身近に聞ける人もいなくずっと手探り状態です よろしければ全体のファイル構成や作り方、使い方などの基本的なことから教えて下さい あと別件なのですが、クラスのインスタンスが生成されたときにメンバ変数はメモリに動的に配置されると思うのですが、メンバ関数はどうなるのでしょうか? インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか? よろしくお願いします!

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

  • ベストアンサー
回答No.2

質問の後半について。 メンバ変数の実体が生成されるのは、プログラム(EXEファイル、DLLファイル)のロード時です。これは、クラスメンバではない、普通のC言語関数も同じ。厳密にいうと、生成ではなく、portable executable形式のファイルが、プロセスのアドレス空間にメモリマップされるだけです。 それに加え、C++のクラスがnewされると、確保したメモリ領域の中にメンバ関数へのポインタが書き込まれます。この仕事を行うのが「コンストラクタ」です。この「コンストラクタ」は、コンパイラがビルド時にこっそりと、実行ファイルへ自動的に加えています。 つまり、C++でnewされたメモリ領域は、 ・メンバ関数へのポインタ。 ・メンバ変数。 で構成されているわけです。 ここまでは、 メンバ変数が非virtualの場合の説明。 virtualの場合は、話が長くなるので、省略します。 キーワードは "v-ptr"(virtual pointer)、"v-table"。 マイクロソフトのCOMオブジェクトなどにも繋がる、なかなか良い話です。 コンピュータ言語というのは、「記述」という面でだけではなく、実行時にどう動くのか、という点も大切なのです。

その他の回答 (3)

回答No.4

回答#2の者です。 回答に誤りがあったので、修正します。 コンパイラの実装依存の面はあるのですが、非virtual関数の場合は、クラスオブジェクト内に関数ポインタは確保されません。newされたときに取られるのは、メンバ変数の分の領域だけです。 今、gccで試したところ、このような実装でした。クラス名とメンバ関数名で、静的に関数の位置を解決しているのですね。 回答者#3さんの例題が正しいと思います。 また、例によって、virtual関数の場合は、話は別です。オブジェクト内にポインタが用意されます。 以上、失礼いたしました。

SAKU-AMS
質問者

お礼

ご連絡が遅れて申し訳ありません 当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした わざわざ試していただいたということで、どうもありがとうございます! ありがとうございました!

  • gentoo314
  • ベストアンサー率41% (15/36)
回答No.3

コンパイル環境などを提示しないと答えられないと思います。 通常ライブラリは、リンカーのオプションに指定すると思います。 VCなどの統合環境ですと意識しませんが、プリプロセッサ、コンパイル、リンクなど、ビルドの過程を理解したほうがいいかと思います。 メンバ関数ですが、言語はC++ですね。 メンバ関数は静的に割り当てられます。通常のCの関数となんら変わりません。 インスタンスの数だけメンバ変数は個々のメモリエリアに確保されますが、メンバ関数は1つだけです。 class におけるメンバ関数を、struct で実現すると以下のようになります。 この2つが等価であることが分かるでしょうか。 class TestA { int a; public: int func( int b ) { return this->a * b; } }; struct TestB{ int a; }; int TestB_func( Test* this, int b ) { return this->a * b; } main() { int c; TestA a; c = a.func( 10 ); TestB b; c = TestB_func( &b, 10 ); ※理解が深まってきたら、仮想関数(virtual)についても勉強しましょう。

SAKU-AMS
質問者

お礼

ご連絡が遅れて申し訳ありません 当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした 例を示して解説していただいたのでとてもわかりやすかったです! ありがとうございました!!

  • BearCave
  • ベストアンサー率20% (189/909)
回答No.1

前半の質問はちょっと意味が分かりませんでした。 私なりの解釈では、 -「hoge.h/foo.lib/bar.lib」という構成のライブラリが存在する -それを使ってラッパーライブラリを作りたい -作ったライブラリは「○○○.h/○○○.lib」という形にして他者に配布したい といった感じですか? 最終的に何をしたいのかを明確にしてくれればアドバイスしやすくなると思います。 >インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか? メンバ関数のコードはメモリー上にすでに生成されていて、クラスインスタンスには各関数へのポインタだけが用意されています。

SAKU-AMS
質問者

お礼

ご連絡が遅れて申し訳ありません 当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした 本当はこちらに書くべきだったのかな? 初めてなのでわからなかったです・・・ ありがとうございました!!

SAKU-AMS
質問者

補足

返信ありがとうございます 質問が不備ですみません おおよそBearCaveさんの解釈で合っているかと思います あと、以前複数のlibファイルをひとつにまとめることは出来ない、というようなことを聞いたので、 元のライブラリの3ファイル+自前のヘッダ1つ&自前のlibファイル1つをプロジェクトに加える、と考えているのですがどうでしょうか? なお、プロジェクト側には既存のライブラリ自体の機能は持たせず、あくまでラッパーを介して処理をさせるつもりです メンバ関数に関しては了解です ありがとうございました

関連するQ&A

  • C++のソースをライブラリ化すると問題が・・・・・・

    他の人のプログラムをLibにして流用しようとしているのですが, 問題にぶち当たってます. Libで定義されているクラスに, ある情報を取得/格納できるクラスがあるのですが, いざ,そのクラスをインスタンス化し, クラスで定義してあるメソッドを実行してインスタンスのメンバ変数に情報を格納した後に,インスタンスのメンバの情報をメソッドなどは使わずに取り出そうとすると一部の情報が格納されておらず抜き出すことができません. そのクラスにはシングルトンで実装されており,クラスが持っている情報表示用メソッドを実行すると,ちゃんと,格納されてるぽいのですが・・・・・.もちろん,メンバ変数はパブリックです. 唯一違うとすれば,取り出すことができるメンバの型はdoubleで,取り出せないのはVector< (独自の構造体) >という点くらいです・・・・.エラー内容は取り出せないというよりはVectorのメモリが確保されていないような感じです. 当然,Libをexeで起動した場合は正常に動いているます. 何か思いつく原因は無いでしょうか?? 宜しくお願いします!!

  • C言語からC++の関数をコールする方法について

    初めて質問させて頂きます。 質問は2つあります。 ●1つ目の質問です。 この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。 方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。 そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました) ●2つ目の質問です。 Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。 しかし、本当に動かしたいのはLinuxでの環境になります。 先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、 実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。 試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。 そのため、ラッパー関数を呼ぶための何かに問題があると思っています。 ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。 Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。

  • *.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を作成したいです。

  • ターボCのライブラリ追加方法

    現在、私はターボCでプログラムを作成しております。そこで質問なんですが、 VC++2010などのライブラリ追加方法はプロパティの中のVC++ディレクトリが有り、 そこでヘッダーとライブラリを追加できるのですが、 ターボCではどのようにすればライブラリとヘッダーの追加ができ、 その関数を利用できるかよろしくお願いします。

  • C++言語でのライブラリファイルの作成と使用法

    よろしくお願いします。 C言語において、例えばMinGWのCコンパイラのLibディレクトリには、拡張子が「.a」のライブラリファイルがたくさん存在しています。これらは、arコマンドで ar crv libMine.a 1.o 2.o のように作成されるものだと認識しています。 一方、C++言語において、例えばBorlandのC++コンパイラのLibディレクトリには、拡張子が「.lib」というライブラリファイルがたくさん存在します。 これらのファイブラリファイルは、C言語のaファイルと同じ役割をする考えてよいのでしょうか? また、C++において自作のライブラリファイル(libファイル)を作成するにはどうすればよいのでしょうか? 次に、C++における自作ライブラリの使用法についてですが、Cではコンパイル時に gcc -o 1.exe 1.c libMine.a のようにして、自作のライブラリファイルを使うことができますが C++のコンパイルコマンド、例えばbcc32コマンドを使ってコンパイルする時に、 自分が作成したlibファイルを使うにはどのようにすればよいのでしょうか? 最後に、Borland C++コンパイラをインストールするときに、Binディレクトリにあるbcc.cfgファイルに -L"c:\Borland\Bcc55\lib" と記述したのですが、これは、 c:\Borland\Bcc55\libにあるlibファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • スタティックライブラリの使い方

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

  • C/C++のヘッダーファイルやライブラリー関数について

    C言語の勉強をはじめました。コードの最初に書く#include<stdio.h>などの ヘッダーファイルやライブラリ関数を見ることはできるのでしょうか? 初歩的なことですみませんがよろしくお願い致します。

  • Linux C言語共有ライブラリを作成するときの

    RedHatLinux7.3(2.96-110)、gcc(2.96 20000731)です。 C言語で共有ライブラリを作成しています。このライブラリは呼び出し側のプログラム起動時にロードされるものなのですが、以下の2つの手順で生成されたライブラリは、どのような違いがあるのでしょうか? どちらも呼び出し側からは関数コールで実行できるのですが、どちらが正しいのでしょうか? 【その1】 1) gcc -shared -o libxxx.so xxx.c (ライブラリ生成) 2) gcc ./libxxx.so -o testcall testcall.c (呼び出し側とライブラリをリンクして実行ファイル生成) 【その2】 1) gcc -fPIC -c libxxx.c(ライブラリのオブジェクト生成) 2) gcc -fPIC -c -shared -Wl,-soname,libxxx.so.0 -o libxxx.so.0.0 xxx.o(共有ライブラリ生成) 3) soname設定 4) linkername設定 5) gcc -c -o testcall.o testcall.c(呼び出し側オブジェクト生成) 6) gcc -o testcall testcall.o -lxxx 7) LD_LIBRARY_PATH設定、exportする 以上、ご存知のかた、どうぞよろしくお願いします。

  • VB 2008 DLL作成の方法

    当方Visual Studio 2008のVB、C++で開発をしています。 VS2008のVBでクラスライブラリとして作成し、ビルドをしてDLLを作成したのですが、 対となるLIBファイルがどこにも見当たりませんでした。 VS6.0のVBではLIBファイルも作成されました。 VS2008のVBでLIBファイルを作成する方法をご存知の方いらっしゃいましたら教えてください。 LIBファイルを使用する理由は、VBで作成したDLLをC++に組み込むときにリンクさせる為です。 ※今回はLoadLibrary関数を使わず、LIBファイルを使おうと考えています 以上、宜しくお願い致します。

  • C++ライブラリの使い方について

    C++初心者です。ゲームプログラミングを学びたいと思い、 「ゲームプログラマになる前に覚えておきたい技術」という本で勉強を始めました。 この本には専用のライブラリが付属しており、それを使用することを前提としているのですが、 ライブラリの使い方がよく分かりません。 こちらの環境は、 OS : Mac OS X コンパイラ : GNU GCC です。 本に付属しているのは、拡張子が.libと.pdbのファイル群です。 調べてみたところ、.libのファイルはWindows環境で使用するもので、 UNIX系のOSでは拡張子は.aになるそうですが、 .libのファイルをMac OS Xで使えるでしょうか? もしできるなら、どのようにリンクしたらいいのかも教えて頂きたいです。

専門家に質問してみよう