- ベストアンサー
C++での静的ライブラリの作成方法とは?
- C++での静的ライブラリの作成方法とは?ライブラリの構成や作り方、使い方などの基本的なことを教えてください。
- C++でライブラリのラッパーを作成したい方による質問です。既存ライブラリの構成や作り方、リンクやインクルードの方法など、基本的な疑問について解説してください。
- C++での静的ライブラリの作成方法はよくわからず、調査している方の質問です。ライブラリのファイル構成や作り方から、インクルードやリンクの方法まで、基本的な知識を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問の後半について。 メンバ変数の実体が生成されるのは、プログラム(EXEファイル、DLLファイル)のロード時です。これは、クラスメンバではない、普通のC言語関数も同じ。厳密にいうと、生成ではなく、portable executable形式のファイルが、プロセスのアドレス空間にメモリマップされるだけです。 それに加え、C++のクラスがnewされると、確保したメモリ領域の中にメンバ関数へのポインタが書き込まれます。この仕事を行うのが「コンストラクタ」です。この「コンストラクタ」は、コンパイラがビルド時にこっそりと、実行ファイルへ自動的に加えています。 つまり、C++でnewされたメモリ領域は、 ・メンバ関数へのポインタ。 ・メンバ変数。 で構成されているわけです。 ここまでは、 メンバ変数が非virtualの場合の説明。 virtualの場合は、話が長くなるので、省略します。 キーワードは "v-ptr"(virtual pointer)、"v-table"。 マイクロソフトのCOMオブジェクトなどにも繋がる、なかなか良い話です。 コンピュータ言語というのは、「記述」という面でだけではなく、実行時にどう動くのか、という点も大切なのです。
その他の回答 (3)
- blueflower1024
- ベストアンサー率53% (16/30)
回答#2の者です。 回答に誤りがあったので、修正します。 コンパイラの実装依存の面はあるのですが、非virtual関数の場合は、クラスオブジェクト内に関数ポインタは確保されません。newされたときに取られるのは、メンバ変数の分の領域だけです。 今、gccで試したところ、このような実装でした。クラス名とメンバ関数名で、静的に関数の位置を解決しているのですね。 回答者#3さんの例題が正しいと思います。 また、例によって、virtual関数の場合は、話は別です。オブジェクト内にポインタが用意されます。 以上、失礼いたしました。
- gentoo314
- ベストアンサー率41% (15/36)
コンパイル環境などを提示しないと答えられないと思います。 通常ライブラリは、リンカーのオプションに指定すると思います。 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)についても勉強しましょう。
お礼
ご連絡が遅れて申し訳ありません 当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした 例を示して解説していただいたのでとてもわかりやすかったです! ありがとうございました!!
- BearCave
- ベストアンサー率20% (189/909)
前半の質問はちょっと意味が分かりませんでした。 私なりの解釈では、 -「hoge.h/foo.lib/bar.lib」という構成のライブラリが存在する -それを使ってラッパーライブラリを作りたい -作ったライブラリは「○○○.h/○○○.lib」という形にして他者に配布したい といった感じですか? 最終的に何をしたいのかを明確にしてくれればアドバイスしやすくなると思います。 >インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか? メンバ関数のコードはメモリー上にすでに生成されていて、クラスインスタンスには各関数へのポインタだけが用意されています。
お礼
ご連絡が遅れて申し訳ありません 当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした 本当はこちらに書くべきだったのかな? 初めてなのでわからなかったです・・・ ありがとうございました!!
補足
返信ありがとうございます 質問が不備ですみません おおよそBearCaveさんの解釈で合っているかと思います あと、以前複数のlibファイルをひとつにまとめることは出来ない、というようなことを聞いたので、 元のライブラリの3ファイル+自前のヘッダ1つ&自前のlibファイル1つをプロジェクトに加える、と考えているのですがどうでしょうか? なお、プロジェクト側には既存のライブラリ自体の機能は持たせず、あくまでラッパーを介して処理をさせるつもりです メンバ関数に関しては了解です ありがとうございました
お礼
ご連絡が遅れて申し訳ありません 当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした わざわざ試していただいたということで、どうもありがとうございます! ありがとうございました!