• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ダイナミックリンクライブラリについて。)

ダイナミックリンクライブラリとは? 実行ファイルとの違いや使い方を解説

このQ&Aのポイント
  • ダイナミックリンクライブラリとは、実行時にメモリ上で実行ファイルとリンクされるファイルのことです。一方、実行ファイル作成時にライブラリもリンクしてある場合はスタティックリンクと呼ばれます。スタティックリンクの場合、実行ファイルのサイズも大きくなります。
  • プログラムは階層構造であり、ファイルの読み書きや画面の制御などの一部は自分で作る必要はありません。先人が作ったライブラリを使い回すことができます。
  • 疑問点として、①ダイナミックリンクライブラリは実行ファイルと同時に実行されるのか、②スタティックリンクによって実行ファイルのサイズが大きくなるのかがあります。

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

  • ベストアンサー
  • _kappe_
  • ベストアンサー率68% (1524/2218)
回答No.7

>(ここでは_Dの部分はスタティックリンクの意味のつもり)は、ダイナミックリンクの意味のつもりですよね? はい、そのとおりです。失礼しました。 >ダイナミックリンクライブラリと、ダイナミックリンクの違いって、何でしょうか? ダイナミックリンクライブラリというのはこれまでの説明に出したx.DLLやy.DLLのような「ファイル」のことです。 ダイナミックリンクは下記に挙げるような「作業」を指します。 ・実行ファイルを作る際にどのダイナミックリンクライブラリを使うかを指定すること(A_D.EXEの生成時にx.DLLとy.DLLを指定する) ・実行ファイルの実行を開始するときに、指定されたダイナミックリンクライブラリをメモリに読み込んで実行の準備を整えること(A_D.EXEの実行を始めるときに、まずA_D.EXEをメモリに読み込み、続けてx.DLLとy.DLLもメモリに読み込む) ここであれこれ説明しても質問者さんの現在の知識レベルだとなかなかイメージが湧かないかもしれません。少し大袈裟に表現するなら、小学生に三角関数の説明をしているような気分です。上手な人ならばうまく要点を伝えられるのかもと思いますが。

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

その他の回答 (6)

  • korena
  • ベストアンサー率10% (3/28)
回答No.6

疑問点が3個あります 1)質問者様にとってプログラミングとはなんでしょうか 2)質問者様の日本語レベルとプログラミングレベルは同程度でしょうか 3)サブルーチンすら理解出来ないでDLLを理解出来ると考えてるのですか ご教授頂けると幸いです。すみませんが。

全文を見る
すると、全ての回答が全文表示されます。
  • _kappe_
  • ベストアンサー率68% (1524/2218)
回答No.5

>ダイナミックリンクライブラリでは、機能を除くと書かれていますが、スタティックリンクライブラリでは、機能を含むとなっているのですが、そういうものなのでしょうか? 回答No.1に書いたプログラムAの場合で説明します。 スタティックリンク形式の実行ファイルをA_S.EXEと呼ぶことにします(ここでは_Sの部分はスタティックリンクの意味のつもり)。A_S.EXEは、プログラムAの本体部分と機能xと機能yを含んでいて大きさ130MBです。実行するときにはA_S.EXEだけあれば動きます。 一方、ダイナミックリンクの場合は機能xと機能yがそれぞれ別のダイナミックリンクライブラリのファイルになっていると想定しています。機能xのファイルはx.DLL、機能yのファイルはy.DLLと呼ぶことにします。 ダイナミックリンク形式のプログラムAの実行ファイルはA_D.EXEと呼ぶことにします(ここでは_Dの部分はスタティックリンクの意味のつもり)。A_D.EXEに含まれているのはプログラムAの本体部分だけで、大きさ100MBです。実行するときにはA_D.EXEだけでは動かせず、A_D.EXE、x.DLL、y.DLLの3つのファイルが必要です。 A_S.EXEの中に含まれていた機能xと機能yを別ファイル(x.DLLとy.DLL)に分離したので、A_D.EXEの中には機能xと機能yを含む必要がなくなったということです。A_D.EXEの中に機能xと機能yを含んだままであると、x.DLL・y.DLLに機能を分離した意味がなくなります。 なお、実行ファイルに.EXE、ダイナミックリンクライブラリのファイルに.DLLとつけるのはWindowsでの流儀です。Windowsを知っている人には想像しやすいだろうと思って例に使いました。 追加で質問をされる場合は、下記の情報を補足してもらえると答えやすくなりますのでよろしくお願いします。 ・単なる書き写しではない100行以上の長さのコンピュータプログラムを自分で書いたことがありますか ・メインルーチンとサブルーチン、ダイナミックリンクライブラリなどについて多数の質問をされていますが、そのきっかけや動機は何ですか

zasx1098
質問者

お礼

では追加の質問に答えます。 ①ありません。 ②Yahoo知恵袋で、ある本のことを調べて、いろんなところのサイトに聞いているうちにそのような言葉を出した人がいたからです。 で、ダイナミックリンクライブラリと、ダイナミックリンクの違いって、何でしょうか?ご教授頂けると幸いです。すみませんが。

zasx1098
質問者

補足

揚げ足をとるようで申し訳ないのですが、(ここでは_Dの部分はスタティックリンクの意味のつもり)は、ダイナミックリンクの意味のつもりですよね?ご教授頂けると幸いです。すみませんが。

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

多分、コンピューター上の CPU、ストレージ、ファイル、メモリーといったものが どのように連動して動いているかといった基礎知識がないまま、 いきなり プログラミングのテクニックに手を出していて どのように動くののかがイメージできなくて 混乱されている気がします。 なので、コンピュータの基礎から学習されることをお薦めします。 > スタティックリンクで、実行ファイルのサイズもそれだけ大きくなる。とはどういうことでしょうか? 1つのプログラムを作るとき プログラマが独自に開発した部分をA 別途提供された部品郡(ライブラリ)をBとします。 これをダイナミックリンクで 実行ファイルを作った場合は 実行ファイルの中身は、Aのみとなります。 #AからはBの部品を使っているので、 #Aだけの実行ファイルでは実行できないように一見、思えますが #Bの部分は別のファイルとして存在していて #実行時にメモリー上でリンクされますので、 #実際には実行可能となります。 これをダイナミックリンクでなくスタティックリンクで  実行ファイルを作った場合は 実行ファイルの中身は A+B となります。 A < A+B なので、ダイナミックリンクよりスタティックリンクの 実行ファイルは Bのぶんだけ大きいことになりますよね。 (それだけ大きくなるというのは そういう意味です)

zasx1098
質問者

補足

ダイナミックリンクライブラリと、ダイナミックリンクの違いって、何でしょうか?ご教授頂けると幸いです。すみませんが。

全文を見る
すると、全ての回答が全文表示されます。
  • korena
  • ベストアンサー率10% (3/28)
回答No.3

疑問点が2個あります 1)質問者様にとってプログラミングとはなんでしょうか 2)質問者様の日本語レベルとプログラミングレベルは同程度でしょうか ご教授頂けると幸いです。すみませんが。

全文を見る
すると、全ての回答が全文表示されます。
  • _kappe_
  • ベストアンサー率68% (1524/2218)
回答No.2

>なぜ、この様な値になるのでしょうか?なぜ、プログラムAが100MBになるのでしょうか? >他も同様です。機能x:10MBは、決め事ですか?他も同様です。 回答No.1に「プログラムのサイズはそれぞれ下記のような感じになるとします」と書いてあるとおり、説明のための例として適当に決めた数字です。 スタティックリンクをした場合のほうがサイズが大きくなることの説明ができれば、他の数字を使っても構わなかったのです。 サイズだけでなく、A・B・C、x・y・zという名前も説明のために適当に決めたものです。

zasx1098
質問者

補足

ダイナミックリンクライブラリでは、機能を除くと書かれていますが、スタティックリンクライブラリでは、機能を含むとなっているのですが、そういうものなのでしょうか?そして、この 2つの意味に違いは、含むか除くかの違いという事でしょうか?ご教授頂けると幸いです。すみませんが。

全文を見る
すると、全ての回答が全文表示されます。
  • _kappe_
  • ベストアンサー率68% (1524/2218)
回答No.1

どこが引用文でどこが質問者さんの文章なのかが分かるようにしてください。たとえば「引用ここから」「引用ここまで」のように書くなど。 また、どこから引用した文章なのかも明示してください。今回はhttps://okwave.jp/qa/q9859367.htmlの回答No.4が元のようです。 疑問点①への回答: それで合っています。 疑問点 ②への回答: たとえば、A・B・Cの3つのプログラムを作りたいとします。 プログラムAはxとyという機能を使う、Bは機能yとzを、Cは機能xとzをそれぞれ使うとします。 各機能の実装に必要なプログラムのサイズはそれぞれ下記のような感じになるとします。 プログラムA:100MB(機能x・y部分を除く) プログラムB:200MB(機能y・z部分を除く) プログラムC:300MB(機能x・z部分を除く) 機能x:10MB 機能y:20MB 機能z:70MB 機能x・y・zをダイナミックリンクライブラリとして実装した場合、プログラムA・B・Cを動かすには上記のサイズの合計、700MBが必要になります。 一方、機能x・y・zをプログラムA・B・Cにスタティックリンクするとサイズは下記のようになります。 プログラムA':130MB(機能x・y部分を含む) プログラムB':290MB(機能y・z部分を含む) プログラムC':380MB(機能x・z部分を含む) 3つの合計で800MBが必要になり、ダイナミックリンクを使った場合よりも合計サイズが100MB増えました。 実際にはこれほど話が単純ではありませんが、大雑把にはこの説明で分かると思います。

zasx1098
質問者

補足

各機能の実装に必要なプログラムのサイズはそれぞれ下記のような感じになるとします。 プログラムA:100MB(機能x・y部分を除く) プログラムB:200MB(機能y・z部分を除く) プログラムC:300MB(機能x・z部分を除く) 機能x:10MB 機能y:20MB 機能z:70MB ここまで引用 で、なぜ、この様な値になるのでしょうか?なぜ、プログラムAが100MBになるのでしょうか? 他も同様です。機能x:10MBは、決め事ですか?他も同様です。ご教授頂けると幸いです。すみませんが。

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

関連するQ&A

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

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

  • 静的リンクライブラリについて

    WindowsのライブラリにDLLやLIBといった形式があり、それぞれ「動的リンクライブラリ」「静的リンクライブラリ」となっていますが、 静的リンクライブラリとしてビルドされたライブラリを、動的に実行プログラムにリンクさせることは(Cやアセンブラなどの)実装次第で可能なのでしょうか? ビルド時にリンカがやってくれてることを実行時に行えればOK・・・という素直な話ではないのでしょうか。DLLも実行時にGetProcAddress()などを使ってアドレス解決をするわけですし、LIBでも同じことをするのは不可能ではないのでは?と思ったのです。 ※動的/静的リンクの概念や具体的な使用方法などはネット上で調べることができましたが、中身にまで踏み込んだ解説をしているページには巡り合えませんでした。そういう具体的な解説のあるページの紹介だけでもとても助かります。また、「根本的に思い違いをしてるんでは?」というご指摘も非常に助かります。 ※私自身↑に対する需要はないのでコスト・メリットとかは度外視です。興味本位というやつです。 ※別段、Windowsやライブラリの形式にこだわりがあるわけではないですが、これが一番メジャーだろう、ということでWindowsのDLL/LIBを対象に質問させて頂きました。 よろしくお願いします。

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

    ダイナミックリンクライブラリで、共通な処理(サブルーチン)を集めたプログラムです。という回答を頂いたのですが。どういう事でしょうか?ご教授頂けると幸いです。すみませんが。 結局、そのダイナミックリンクライブラリには、全てのソフトで、共通する処理をその中にまとめて、その中から、ファイルを開くということを呼び出すということでしょうか?ご教授頂けると幸いです。すみませんが。

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

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

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

    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言語です。 文章下手ですみません^^;

  • Release用にもDebug用にも使えるライブラリの作り方

    皆さんこんにちは。 MFCでスタティックライブラリをつくっています。 ライブラリのコンパイルの際に、ReleaseかDebugの いずれかを指定しますが、それぞれのモードで つくったライブラリは、それぞれのモードの実行 ファイルにしかリンクできないのでしょうか? どちらのモードの実行ファイルにもリンク可能な ライブラリをつくることは可能でしょうか? もし可能な場合、どのような手順でつくれば よいのでしょうか? どうぞよろしくお願いいたします。

  • Qtライブラリを静的にリンクしたい

    Qt 5.11.0 を使ってGUIアプリをつくろうとしているのですが、実行時の問題があります。 ソースは初心者用のサンプルソースコードで、Qt Creator を使って以下の「main.cpp」を作成しました。 #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } ウインドウ生成は「mainwindow.cpp」で、 #include "mainwindow.h" #include <Qtgui> #include <QtWidgets> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QLabel *label = new QLabel(tr("Hello World.")); setCentralWidget(label); } MainWindow::~MainWindow() { } となっています。 これをビルドして、Qt Creatorから実行するとウィンドウが表示されます。 しかし、単独で(ダブルクリックで)実行しようとすると 「コンピューターにQt5Cored.dllがないため、プログラムを開始できません。・・・」 というシステムエラーが表示され、実行できません。 これ以外に、mingwとmake を使って別のサンプルソースをコンパイルしても同様のエラーが出てきます。 実行ファイルと同じディレクトリにQt5Widgets.dll、Qt5Core.dll、Qt5Gui.dllの3つのDLLをコピーすると、実行できます。 しかし、いちいちDLLを要請するプログラム構成は好きでないのと、同名のライブラリlibQt5Widgets.a、libQt5Core.a、libQt5Gui.aがあることから、できれば静的にリンクしたいと思っています。 静的にリンクするために以下の4つの方法を試してみましたが、ことごとく失敗しています。 方法1 ライブラリを指定してリンク g++ -static -O0 -g -o Qt_test.exe Qt_test.obj -lmingw32 -LC:\Qt\5.11.0\mingw53_32\lib -lQt5Widgets -lQt5Core -lQt5Gui -lqtmain -LC:\utils\my_sql\my_sql\lib -LC:\utils\postgresql\pgsql\lib -lshell32 のような書式で、3つのライブラリの順番を入れかえて6パターン試しましたが、DLLエラーは変わりません。 方法2 ライブラリをld.exeでまとめたオブジェクトファイルを作ってリンク 「GNUソフトウェアプログラミング」という本の112ページにリンカ「ld」のオプションについての記述があり、オブジェクトファイルとライブラリ同士をリンクする方法が紹介されていたので試してみましたが、未解決の参照がない?のか、20バイトのファイルが出力されただけでした。 ld -static -r -o qtobj.o C:\Qt\5.11.0\mingw53_32\lib\libQt5Gui.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Widgets.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Core.a ld -static -r -o qtobj.o -LC:\Qt\5.11.0\mingw53_32\lib -lQt5Gui -lQt5Widgets -lQt5Core 方法3 arでオブジェクトファイルを作る ar rs qto2.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Gui.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Widgets.a C:\Qt\5.11.0\mingw53_32\lib\libQt5Core.a でライブラリをまとめたファイルは作れるのですが、コンパイルするとリンク時に qto2.a: error adding symbols: Archive has no index; run ranlib to add one となり、うまくいきません。 方法4 Qt creator で静的リンク Qt Creatorで「ライブラリの追加」を行うと、「HelloWrold.pro」に以下の行が加わり、リンクできそうなのですが、実行時にやはりDLLを要求されます。 LIBS += -LC:/Qt/5.11.0/mingw53_32/lib/ -lQt5Core 結局は、Qtで静的なリンクを行う方法が知りたいのです。 ご助言をお願いいたします。 環境は、Win7、Mingw、QtはMingwパッケージオプションを付けてインストールしており、 「C:\Qt\5.11.0\mingw53_32\lib\libQt5Core.a」 「C:\Qt\5.11.0\mingw53_32\include」 「C:\Qt\5.11.0\mingw53_32\bin\Qt5Core.dll」 があり、中にDLLもライブラリもあります。 よろしくお願いします。

  • Unix上C++でのdllとインポートライブラリの関係

    こんにちわ。 いつも教えてgooにお世話になっているorange_pieです。 UNIX上のC++で作成した自作ライブラリをdllにして配布したいのですが、 Unixでの基本的な考え方を教えてください。 (1)Unix上ではDLLの標準的な名称は”libxxxx.so”とするのが普通ですか?  ※この形式ならLD_LIBRARY_PATH環境変数が検索してくれる。。。 (2)通常、DLLにする場合、インポートライブラリ(.lib)と実際のライブラリ(.so)を作成して、使用する側はインポートライブラリのみをリンクするのでしょうか? (3)配布されたdllを使う側では、Link時にインポートライブラリをリンクして、関連インクルードファイルをインクルードするだけで使えるのでしょうか? (4)上記の(2)のように、インポートライブラリとライブラリの実態を作成する為のコンパイルオプションが見つかりません。(ldのmanを見たのですが、意味がわからないと言うか。。。。。) この質問は、自作ライブラリからlibxxx.soという形のオブジェクトファイルを作り、別プログラムからこのlibxxxをコンパイルオプション(-l)でリンクしてみたら正しく動作したのですが、これでは結局ライブラリの本体が一緒にリンクされている様子で、出来上がった実行形式のファイルサイズが静的ライブラリとしてリンクした時と同じ大きさになっていることに疑問を抱いてしまったものです。  この状態でも、ライブラリの方だけコンパイルしなおして実行すると ちゃんとライブラリの変更点は反映されるので問題は無いのですが、 これでもダイナミックリンク・ライブラリと呼べるのでしょうか?

  • 共有ライブラリへのパス指定の方法

    共有ライブラリへのパス指定の方法について教えて下さい。 環境は TurboLinux / C言語です lib_k.sl という共有ライブラリがあります。 【開発環境】  /hhn --- lib -(ここにlib_k.slがある)     |     -- src - ・・・(ここにプログラムのソースファイルがある) 【実行環境】  /ppc --- lib -(ここにlib_k.slを置く)     |     -- ld -(ここにプログラムのロードモジュールを置く) 開発プログラムのメイクファイルに、  /hhn/lib/lib_k.sl と書いてリンクさせています。すると、実行環境でも  /hhn/lib/lib_k.sl にリンクしようとしに行っているようです。 実行環境で /ppc/lib/lib_k.sl にリンクするには、どのようにすればよいのでしょうか? Cプログラミングはずっとやっていますが、共有ライブラリは使用したことが有りません。 ご教授お願いします。

  • 起動時にダイナミック リンク ライブラリを読み込めませんでした

    Windows98 Second Edition起動時に 次のメッセージが表示されます。 OKを押下すると、通常どおり使用でき、 問題ないような感じがしますが、 毎回表示されます。 Safeモードでも表示されます。 表示されないようするには、どうすればよいでしょうか? -------------------------------------- Windows ネットワーク -------------------------------------- 次のダイナミック リンク ライブラリを読み込めませんでした: ENDPNP.DLL このアプリケーションの実行に必要なライブラリ ファイルのうちの1つが見つかりません。 次のうちいくつか、またはすべての機能を利用できません: EpsonPeripheralNetwork              OK --------------------------------------