静的ライブラリ利用時の実行ファイルのサイズ

このQ&Aのポイント
  • 静的リンクライブラリを利用する際に実行ファイルのサイズについて疑問があります。
  • 静的ライブラリには必要のない部分も含まれるのか、またそれが実行ファイルのサイズに影響するのかについて調査しています。
  • 自作ライブラリを作成するにあたって、複数の静的ライブラリを利用するか、1つのライブラリに集中するか迷っています。
回答を見る
  • ベストアンサー

静的ライブラリ利用時の実行ファイルのサイズ

言語はC++,コンパイル環境はVS2013のリリースモードです. 静的リンクライブラリと動的ライブラリについてはある程度は理解しております. 静的ライブラリに関する質問なのですが,そのライブラリの1部しか利用しない場合でも,利用側プログラムのバイナリにはライブラリのバイナリすべてが含まれてしまうのでしょうか. 例えば,100個の関数から構成される静的ライブラリを作ったとして,あるプログラムAはそのライブラリのうちの10個の関数しか呼び出さないとします. このとき,プログラムAのバイナリは,ライブラリの使わない関数のバイナリもすべて含んでしまうのでしょうか. 自作ライブラリを作成するにあたって,1つの静的ライブラリにプログラムを集中させるべきか否かで悩んでおります.

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

>そのライブラリの1部しか利用しない場合でも,利用側プログラムのバイナリにはライブラリのバイナリすべてが含まれてしまうのでしょうか.  そのとおり。正解です。  例え、100個の関数の内、1個しか使わなくても、全部リンクされます。  理由は、そのたった一個の関数が、巡り巡って、他の全部の関数を呼び出している「かも」しれないからです。リンカーが、必要な関数だけをリンクするようにしようとすると、内部に含まれている全ての関数が、自分にはどの関数が必要かをコンパイラーに宣言させる必要が出てきます。また、ライブラリーにグローバルな変数が含まれていれば、それも列挙する必要があります。  そのような宣言があったとしても、今度は、リンカーは全ての必要な関数と変数等を列挙し、その部分だけをバイナリレベルで抜き出し、新しいライブラリーを構築する・・・という作業が必要です。単一のライブラリー内だけでその解析が収まれば良いですが、別のライブリー経由でもう一度自分のライブラリーの別の関数を呼ぶなんて可能性も考えれば、これ、相当困難な作業になります。  というわけで、リンカーは、単純に、必要と宣言されたライブラリーを、ファイルまるごとターゲットファイルにリンクします。

marriess
質問者

お礼

詳しく分かりやすくありがとうございました. 大変助かりました.

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.2

>静的ライブラリに関する質問なのですが,そのライブラリの1部しか利用しない場合でも,利用側プログラムのバイナリにはライブラリのバイナリすべてが含まれてしまうのでしょうか. 基本的にはそうですが最近はスマートリンクというものもあります。

marriess
質問者

お礼

回答ありがとうございました.

関連するQ&A

  • ライブラリファイルのリンク (リリースバージョン時)

    VisualC++ 2005 Express Editionでライブラリファイル(.lib)をリリースバージョンでビルトし、違うプログラム(デバックバージョン)でライブラリファイルをリンクしたとき 1>コンパイルしています... 1>main.c 1>リンクしています... 1>CheckMemory.lib(check_memory.obj) : MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。 1>LINK : warning LNK4075: /INCREMENTAL は /LTCG の指定によって無視されます。 1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 と出るのですが、これはどうゆうことなのでしょうか? 分かる方いらっしゃいますか?お願いします。 ちなみにライブラリファイルは簡易メモリチェックプロブラムでデバック時のみ使用したいと考えているプログラムです。 使用言語はc言語です。 文章下手ですみません^^;

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

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

  • 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ファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • 自作ライブラリの作成方法

    お世話になります。現在、C言語でプログラムを作成してますが、 自作ライブラリの作成方法について教えてください。 現在は、1つのfileにmain()と関数を両方記述してます。 (少々、見にくく解消したいのですが良い本がみつかりません) 知りたいことは、 1)ライブラリのコンパイルから作成方法 2)headerの書き方 3)それらの保存場所、他、環境設定 ※入門書は、かなり読みましたがずぶの素人です。  もし良い本があれば紹介ください。 環境は、 BCC(WINDOWS) GCC(linux) を使ってます。 宜しくお願いします。

  • Pro*Cで動的SQLを実現する為のライブラリ関数はどのファイルに入っているのでしょうか?

    こんにちわ。 UNIXのC++でPro*Cを使って動的SQLを使ったプログラムを作っています。 プログラムコードは出来上がっていて、単独コンパイルは通るのですが、 実行形式のプログラムを作る時のリンクで「未定義のシンボル」として 以下の4ライブラリ関数がエラーになります。 sqlald()関数、sqlprc()関数、sqlnul()関数、sqlclu()関数 これはおそらく、リンクする際にこれらの関数が含まれているライブラリを リンクできていないだけなのではないかと思っているのですが、 肝心のライブラリがどこのどれなのかがわかりません。 どなたかご存知の方がいらっしゃいましたら、教えてください。 もしかして、プログラム中でもこれらの関数をextern する以外に 何か必要なのでしょうか?

  • ライブラリ??

    VCをつかってコーディングしています。 C言語仕様のネットワークプログラミングです。 socketをつくりデータのやり取りをするのですが gethostbyname()という関数が動作しません。 ちゃんとコンパイルもビルドもとおります。 ライブラリもwsock32.libやws2_32.libをリンクしています。 なにが原因なのかわかりません。 WINDOWSがまずいのでしょうか? 宜しくお願いします。

  • UNIX上のプログラムで使うライブラリの中身を知る方法

    過去にUNIX上で動作するプログラムを作成していて、その中で多数の.aや.so(標準では無く、オリジナルのもの。)を使っているのですが、.aや.so内にどのような関数があるのか、もしくはそのライブラリに関係するソース名は何か知る手段ってありませんか? かなり前のものなので、関数仕様書もmakefileも無いため、何をライブラリとしているのか分からず困っています。 駄目もとで、バイナリエディタで中身を確認してみたのですが、何処の情報がそれを示しているかいまいち分かりませんでした。

  • CLIでのライブラリのリンク方法について

    VS2003のManagedC++では簡単にすることができたネイティブなライブラリを、VS2005のC++/CLIで利用することができません。 VS2003では、ファイルのインクルード、インクルードパスの追加、ライブラリのリンク、ライブラリパスの追加を行うと正しくリンクすることができたライブラリを、同じ方法でリンクしようとすると、VS2005ではコンパイルに失敗します。 ネイティブなライブラリをリンクするので、/clr:pureモードではなく、/clrモードにすればできると思い、試してみたのですが、 error LNK1314: COFF シンボル テーブルが壊れているか、または無効です。未定義のスタティック シンボルまたはラベル シンボルです。 というエラーが起きてコンパイルすることができません。 clrモードのほかに何か設定すべき項目があるのでしょうか。

  • ライブラリのリンクについて。

    ふと、疑問に思ったので質問させてもらいます。 C言語などでプログラムを作る時、ライブラリをリンクさせて使うと思いますが、その場合プログラムを実行させた場合メモリー上ではどうなるのか教えた貰いたいです。 例えばprintf関数を使う場合その命令そのものがプログラムに組み込まれてメモリーに読み込まれているのかということです。 前にどこかで読んだ記憶があるのですが、いろいろなところから呼び出される標準的なものはシステムで一箇所にありそれを使うなどということがあったような無かったような記憶があやふやですが見た覚えがあるので気になってしまいました。 あとライブラリなどから一つだけ関数を使う場合、使わない他の関数などもメモリーに読み込まれていたりするのでしょうか? よく使う自分で作った関数を一つのファイルにまとめ、それを定義したヘッダーファイルをincludeした場合も同様で使わないほかの関数はどうなるのでしょうか?

  • Linuxで実行ファイルを実行

    Linux上でC言語をコンパイルし、作成された実行形式ファイルを実行しようとしたのですが、実行できません。 作業フォルダは /var/www/html です。 gcc program.c でコンパイル、 作成されたa.out(ls でフォルダ内にあるのは確認済です) を以下の方法で実行しようとしましたが、全てできませんでした。 1. [root@host-210-161-57-177 html]# a.out bash: a.out: command not found 2. [root@host-210-161-57-177 html]# ./a.out opendir: No such file or directory 3. [root@host-210-161-57-177 html]# %./a.out bash: fg: %./a.out: no such job 4. [root@host-210-161-57-177 html]# % ./a.out bash: fg: %: no such job gcc -o program program.c でファイル名を指定してコンパイルしてみても同様の結果でした。 ご存じの方、どうかご回答をよろしくおねがいします。

専門家に質問してみよう