
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オブジェクトなどにも繋がる、なかなか良い話です。
コンピュータ言語というのは、「記述」という面でだけではなく、実行時にどう動くのか、という点も大切なのです。
No.4
- 回答日時:
回答#2の者です。
回答に誤りがあったので、修正します。
コンパイラの実装依存の面はあるのですが、非virtual関数の場合は、クラスオブジェクト内に関数ポインタは確保されません。newされたときに取られるのは、メンバ変数の分の領域だけです。
今、gccで試したところ、このような実装でした。クラス名とメンバ関数名で、静的に関数の位置を解決しているのですね。
回答者#3さんの例題が正しいと思います。
また、例によって、virtual関数の場合は、話は別です。オブジェクト内にポインタが用意されます。
以上、失礼いたしました。
ご連絡が遅れて申し訳ありません
当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした
わざわざ試していただいたということで、どうもありがとうございます!
ありがとうございました!
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)についても勉強しましょう。
ご連絡が遅れて申し訳ありません
当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした
例を示して解説していただいたのでとてもわかりやすかったです!
ありがとうございました!!
No.1
- 回答日時:
前半の質問はちょっと意味が分かりませんでした。
私なりの解釈では、
-「hoge.h/foo.lib/bar.lib」という構成のライブラリが存在する
-それを使ってラッパーライブラリを作りたい
-作ったライブラリは「○○○.h/○○○.lib」という形にして他者に配布したい
といった感じですか?
最終的に何をしたいのかを明確にしてくれればアドバイスしやすくなると思います。
>インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか?
メンバ関数のコードはメモリー上にすでに生成されていて、クラスインスタンスには各関数へのポインタだけが用意されています。
この回答への補足
返信ありがとうございます
質問が不備ですみません
おおよそBearCaveさんの解釈で合っているかと思います
あと、以前複数のlibファイルをひとつにまとめることは出来ない、というようなことを聞いたので、
元のライブラリの3ファイル+自前のヘッダ1つ&自前のlibファイル1つをプロジェクトに加える、と考えているのですがどうでしょうか?
なお、プロジェクト側には既存のライブラリ自体の機能は持たせず、あくまでラッパーを介して処理をさせるつもりです
メンバ関数に関しては了解です
ありがとうございました
ご連絡が遅れて申し訳ありません
当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした
本当はこちらに書くべきだったのかな?
初めてなのでわからなかったです・・・
ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- 音楽・動画 Apple Musicのプレイリストに曲を追加できません 1 2022/08/21 01:24
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- iPhone(アイフォーン) 仕事でPDFファイルをダウンロード、閲覧するのにiBooksを使っていますが、ライブラリに凄い数のフ 2 2022/11/16 07:08
- Excel(エクセル) 1つのファイルを3つのフォルダにファイル名を【明日の日付】にして、コピーをしたい 2 2022/12/21 17:43
- YouTube ユーチューブへの動画投稿にサムネイルを付ける方法は? 1 2022/07/21 23:45
- Excel(エクセル) Excelで漢字人名が勝手に並び変わる(続) 4 2023/03/21 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数の変数を宣言する時、同時...
-
C# インスタンスの破棄
-
変数名の付け方
-
private static という変数の修飾
-
オブジェクト参照がオブジェク...
-
C#において、同じインスタンス...
-
文字列を日付に変換でParseExce...
-
VB.NET getとsetの概念がわかり...
-
[Visual C#] 優先される処理に...
-
SQLを連続発行する時の正しい(?...
-
C++での静的ライブラリの作成方法
-
生成したインスタンスを削除す...
-
C#「オブジェクト参照が必要で...
-
PHPExcel使用で2枚目のシートを...
-
Dimensionクラスの使い方
-
フォームの存在をチェックする方法
-
javaのインスタンス変数とクラ...
-
「インスタンス」の意味をわか...
-
CFrameWnd とCFormView
-
クラスのインスタンス名をクラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
オブジェクト参照がオブジェク...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
VB.NET getとsetの概念がわかり...
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
C#「オブジェクト参照が必要で...
-
インスタンスを同じ名前で作成...
-
SQLを連続発行する時の正しい(?...
-
インスタンスのハンドル
-
C#の構造体の開放のしかた
-
クラスのインスタンス名をクラ...
-
C#のメモリ解放についてご教授...
-
javaのクラスの作り方、エラー...
おすすめ情報