• ベストアンサー

共有ライブラリの作成について

呼び出した関数名の名前を表示させる、 テスト用共有ライブラリ「testLib.so」を作成しようと思っています。 そしてそのライブラリを他のプログラムから呼び出すというものです。 以下、内容。 int test1(void){ printf("test1 program."); } int test2(void){ printf("test2 program."); } int test3(void){ printf("test3 program."); } 【パターン1】 上記関数毎でファイル分けし、 test1.c、test2.c、test3.c と言うファイルを作成。 これらの各オブジェクトを取り込んで共有ライブラリを作成するパターン。 【パターン2】 全ての関数を「testDisp.c」と言うファイルに記述し、 このオブジェクトファイルで共有ライブラリを作成するパターン。 上記パターン1と2では用途によって使い分け方法があると言う話を先日聞いたのですが、どの様な場合に1、どの様な場合に2のパターンを使用するのでしょうか。 宜しくお願い致します。

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

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

dynamic linkではそれほど違いはないと思いますが、むしろstatic libraryだと細かく分けておいた方が最終的に実行ファイルのサイズを小さく出来ます。厳密にはシンボル解決のオーバーヘッドが多少増えたり、コンパイラの最適化などにも影響するかもしれません。

megumi1122
質問者

お礼

質問を締め切らせて頂きます。 お二方のご意見、大変参考になりました。 回答して頂きありがとうございます。 甲乙つけ難く、 一番初めに回答下さった方を良回答とさせて頂きました。

megumi1122
質問者

補足

と言う事は【パターン1】の場合、実行ファイルのサイズは小さくなりますが、シンボル解決のオーバーヘッドの増加やコンパイラの最適化に影響すると言う事により、 結果として処理時間、メモリ使用量、消費電力の増加に繋がる可能性があるという解釈で宜しいでしょうか。 再度見て頂けましたら、お手数ですが回答の程宜しくお願い致します。

その他の回答 (1)

回答No.2

静的ライブラリの場合、関数は「1ソース単位」で実行ファイルに取り込まれます。(正確には「1オブジェクト単位」) パターン1の場合、test1を呼び出すと、実行ファイルにはtest1だけが取り込まれ、test2、test3は取り込まれません。 パターン2の場合、test1を呼び出すと、実行ファイルにはtest1、test2、test3のすべてが取り込まれます。呼びもしていない無用なtest2、test3が実行ファイルに存在する事になります。 もし、test2、test3が「巨大な関数」であれば、実行するたびに「無用な関数の為に、不必要なロードが行われ、余計なメモリを食う」と言う事になります。 パターン1は「それぞれが独立した関数になっている場合」の作り方です。 パターン2は「各関数に関連性があり、どれか1つを使う場合は、他の関数も必ず使う場合」の作り方です。 例えば、fopenとfcloseは必ずセットで使うので、同一のソース(オブジェクト)になっているのが普通です。fopenしておきながらfcloseしない、なんて書き方は普通はしませんし、fopenしてない物はfcloseできませんから。

megumi1122
質問者

お礼

質問を締め切らせて頂きます。 お二方のご意見、大変参考になりました。 回答して頂きありがとうございます。 甲乙つけ難く、 一番初めに回答下さった方を良回答とさせて頂きました。

megumi1122
質問者

補足

パターン1、パターン2、それぞれに対し、大変わかり易い回答大変ありがとうございました。 更に自分でも色々調べてみようと思っております。 勉強になりました。

関連するQ&A