• ベストアンサー

静的リンクと動的リンク

組込み関係の者です。(μITRONおんりー) できれば具体的な例などを挙げて頂いてご説明いただけると 助かります。 (1)静的リンクとは、ビルド時にライブラリファイルとリンクすることでしょうか?ソースファイルのAPIを呼び出しているのは静的リンク? (2)ビルドというのは、静的リンクを行ってロード用の1つのファイルを作成すること? CPU内蔵のROMに焼くのはこの1つのファイルのみ? (2)動的リンクする場合、どこにどういった形で置いておくもの? (μITRONでは動的リンクはないですが、Linuxとか使った場合) 宜しくお願い致します。

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

  • ベストアンサー
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

静的リンク:プログラムが使っているライブラリをリンカが 組込み、実行形式ファイルの中に全ての使用ライブラリが存 在するように作成。 動的リンク:目的は複数のプログラムのトータルファイルサ イズを小さくすること。これにより、メモリの使用量を減少 させることが可能な場合もある。 静的リンクだと同じライブラリが、複数のプログラムの実行 形式ファイルに存在する。メモリの中に複数の同じものが存在 するということ。 動的リンクは、動的リンクライブラリのライブラリを複数のプ ログラムが使用する。 ただし、動的リンクライブラリファイルの中には使用しない 機能もあるので、使用プログラムが少ない場合、逆にファイル サイズが大きくなるので注意。 動的リンクはライブラリの呼び出しに時間がかかるのが一般的。 以上から動的リンクはマルチプログラミングでの利用がメイン となる。なので、同時に複数のスレッドから呼び出されても 矛盾しない構造が必要。 という前提を踏まえて。 (1)ライブラリが静的リンク用と動的リンク用が用意されている 場合、リンク時にどちらにするかを指定する。静的リンク時には 必要なモジュールだけが組込まれる。 (2)ビルドというのは静的リンクであっても動的リンクであって も構わない。実行できるプログラムを作ること。その手段は問 わない。 (2)動的リンクは動的リンクライブラリファイルを実行プログラ ムと同じフォルダ(ディレクトリ)に入れておけば間違いないが 複数のプログラムが使うという目的から、システムライブラリ フォルダに入れるのが一般的。

FFF10FFF
質問者

お礼

勉強になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

μITRONでも、ローダブルモジュールを分割して、trap命令などを使って呼び出すことがあります。これはある意味で動的リンクだといえますね。

FFF10FFF
質問者

お礼

ご教示ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VS2013リンクするライブラリ一覧表示方法は?

    こんばんは。 Visual Studio 2013の初心者です。基本的なことで困っております。 どうかアドバイスをお願い申し上げます。 ・質問内容 プロジェクトに登録されているリンクするライブラリ名(*.lib)を確認する(一覧表示する)方法を教えて下さい。 ・背景 とある仕事を引きつぐことになりまして、貰ったVS2013のプロジェクト(ソース)をビルドしようとしましたが「****.lib」がありません。と出て来てリンクエラーになってしまいます。 足りないライブラリを追加してまたビルドすると別の「****.lib」がありません。と出てしまいます。この繰り返しです。 しかし、その都度「***.libファイルが足りない」と言って貰うのは、ウザがられるので一括して見る方法が判りません。 プロジェクトファイルでリンクに必要な「ライブラリの一覧」を見たいのです。そして、「これだけのlibが無いので欲しい」と一括して貰いたいのです。 しかし、lib名を検索掛けても何処にリンクに必要なライブラリ一覧が記録されているファイルが見つかりませんでした。 一体何処に記録されているのでしょうか? 色々web検索したのですがどうしても見つかりません。 大変、難儀しております。 宜しくお願い申し上げます。

  • OpenCV2.0or2.1でスタティックリンクライブラリをビルドした

    OpenCV2.0or2.1でスタティックリンクライブラリをビルドしたい 表題の件ですが、MFCをスタティックリンクさせてビルドしているアプリケーションだと、OpenCVをインストールしたときに出来上がるライブラリではエラーの出るものがあります。そのエラーはMFCをDLLでビルドすると出ません。なのでOpenCVをスタティックライブラリでビルドすることで解決しそうなのですが、OpenCVの場合これがかなりややこしいです。 アプリケーションのソリューションにOpenCVの各ライブラリのプロジェクトを挿入する方法も試みたのですが、依存関係が複雑で解決しきれませんでした。 ということでOpenCVのスタティックリンクライブラリのビルド方法を知りたいのですが、Webにある情報ではうまくいかないものが多いので、いろいろな見識をうかがわせていただければ幸いです。 ■環境 VisualStudio2008Professional+OpenCV2.0or2.1+CMake

  • ダイナミックリンクライブラリについて。

    実行ファイルとは別に ダイナミックリンクライブラリというファイルがあって 実行時に メモリー上でこれらがリンク(連結)されて実行されます。 実行するたびにリンクするからダイナミックリンク(動的リンク)と呼びますが 反対に、実行ファイル作成した時点でライブラリもリンクしてあるのなら、 スタティックリンク(静的リンク)です。 スタティックリンクの場合、実行ファイルのサイズもそれだけ大きくなります。 と、プログラムというのは、階層構造です。 表面上に見えている機能は、プログラムそれぞれで違いますが どんなプログラムでも、ファイルの読み書きや画面の制御といったことは 行っています。 こういった階層構造の底辺の部分は、わざわざ自分で作らなくても 先人が作ってくれたもの(ライブラリ)を使い回せばよいのです。 で、疑問点が、2つあって①ダイナミックリンクライブラリとは、実行ファイルとダイナミックリンクライブラリというファイルが同時に実行される(まとめて)ということでしょうか? ②スタティックリンクで、実行ファイルのサイズもそれだけ大きくなる。とはどういうことでしょうか? ご教授頂けると幸いです。

  • ライブラリ内の処理中におけるライブラリリンクについて

    VC2005を使用しています。 ライブラリからライブラリファイルって使用できるんでしょうか? (例) A.lib内の処理に、B.DLLを明示的に読み込み処理 ----------------- <A.lib内の処理> hDLL = LoadLibrary("B.dll"); // DLLのロード if (hDLL != NULL) { ~ 処理実行 ~ } ----------------- 私の環境で何度やっても、GetLastErrorにて、 "7E"(ERROR_MOD_NOT_FOUND)が出力されます。 ロードしているパスに、B.dllは必ずあります。 上記の例は明示的リンクですが、暗黙的リンクでもかまいません。 ライブラリ処理の中でライブラリファイルを使用するには、 どうすれば良いでしょうか。 もしかして、ライブラリ内で他のライブラリを使用できない 等のオチもあるのでしょうか...。

  • 共有ライブリの作成。-fPICオプションは必須?

    http://0xcc.net/blog/archives/000107.html http://linuxjf.sourceforge.jp/JFdocs/Program-Library-HOWTO/shared-libraries.html UnixやLinuxで共有ライブラリのコンパイル・ビルドに-fPICや-KPICのオプションは必須ですか? 共有ライブラリ(起動時自動的にロード)で必須で、 動的ライブラリ(実行中に関数を使ってロード。)の場合、不要という事でしょうか?

  • System.load() と System.loadLibrary() の違いを詳しく教えて!

    javaでwebアプリを開発してます。 ※OSはLinux(Turbo10)、webサーバーはtomcat5です。 ※ネイティブメソッド呼び出しのため、シェアードライブラリをロードします。 そこで質問ですが、 System.load("フルパス付きライブラリファイル名")と System.loadLibrary("ライブラリ名")では 何が違うんでしょうか? JDK1.4のjavadocには一応 load→ダイナミックライブラリとしてローカルファイルシステムからロード loadLibrary→システムライブラリをロードします と書かれていますが、これはloadの場合は実行時にのみ参照しに行き、loadLibraryの場合はメモリ上に持つということでしょうか?

  • LINK : fatal error LNK1104: コンパイラは、ファイル 'DxErr9.lib' を開くことができません。

    使用ソフトはvisual c++.netで DIRECTXの雑誌に付録していたファイルを使って、 ビルドしてみたのですが、 LINK : fatal error LNK1104: コンパイラは、ファイル 'DxErr9.lib' を開くことができません。 っと表示され、EXEファイルが生成されませんでした。 ライブラリファイルにちゃんと登録して、 リンカの依存する関係にも登録したのになぜ? ちなみにライブラリファイルにはちゃんと dxerr9.libはありました。

  • 【C++】静的リンクと動的リンクの違い

    静的リンクと動的リンクの違いについて教えてください。 ググって、wikiにて確認したところ、 動的リンクは、実行時にプログラムの結合を行う。 静的リンクは、コンパイル直後の実行ファイル生成時に、ライブラリ等を全てリンクし、必要なコードが全て揃った実行ファイルを生成する。 というのはわかりました。 それを踏まえて、  (1)-(1)libファイルで静的リンクさせるケース   メソッドやプロパティのインデックスというかインタフェース仕様のみ書かれている。   そして、そのインデックスを元にコンパイルチェックを行っている。  (1)-(2)objファイルで静的リンクさせるケース   objには、.cppと、.h に書かれている処理のうち、そのソース本体(そのクラス自身のモノとして持っている処理)のプロパティやメソッドのことが機械語で書かれている。   プロパティやメソッドが書かれているため、当然インタフェース仕様もわかる。 であろうと捉えていますが、この認識で大雑把には合っていますでしょうか? また、DLLを使う場合、動的リンクとは呼ばれているものの、 「DLLでは、objに加え、必要なリンクの情報まで持っている」と思われるので、 結局、リンカによるリンク実行時に、インタフェースで不整合が起きていないかはチェックされているという認識なのですが、合っていますでしょうか?  (だとすると、なぜ、ある意味、DLLを使っていても静的リンクなのかなと感じ、動的リンクと呼ぶことに不自然さを感じます) 宜しくお願いいたします。 .

  • gtkに関する質問

    GTKというライブラリで、ソースを書いてコンパイルした所 数え切れない程のエラーがでてしまう(実際のソースコードは10行未満)インクルードファイルに色々構文エラーがあるみたいですが、リンクに指定するライブラリを間違えたのでしょうか。 もし間違えたのならどのライブラリとリンクすれば良いのか教えてください。(これかなと思うライブラリを色々リンクしてみましたが無理でした) ちなみに、コンパイルしたOSはLinuxでTurboLinuxというディストリビューションです。 そしてコンパイルに使ったコマンドは下記の様に書きました gcc -o GTK gtk.c -I /usr/include/gtk -lgtk -L /usr/lib

  • .libファイルのリンク

    Visual C++ 2005 Express Edition を使ってプログラミングの勉強をしています。 自分でdllを作りそれを他のプロジェクトにリンクしようとしたのですが、 .libファイルをプロジェクトに追加したところ、ダイアログボックスが出現し、 拡張子".lib"を含むビルドファイルに対するカスタムビルド規則が見つかりませんでした。 この拡張子のファイルをビルドするためのカスタムビルド規則を定義する、新しい規則ファイルを作成しますか? と聞かれました。 意味が分からないので "いいえ"にしたところ、コンパイルエラーになりました。 この場合はどうしたらいいのでしょうか??