- ベストアンサー
exeファイルはどのdllを参照すべきか、知っているのでしょうか。
dllとは、プログラムが実行時に参照するものですよね。 よく使われる機能があらかじめ作られているものですよね。 私はC言語しか知らないので、C言語でプログラミングすることで話を進めさせてください。 (とは言っても、ごく初歩的なプログラムが組めるだけの素人です。) OSはWindowsということにします。 C言語は、関数の集まりでソースが書かれています。 dllも、中身に関数の実体が記述されている、そういうイメージでしょうか。 私がもっと勉強して、複雑なプログラムを組んだりすると、 「あ、これはdllに実体がある機能だから、いちいち実装を書かなくてもいいんだな」 と考えて、ソースファイル( ~.c )の中でその関数を使うだろうと思います。 私がよくわからないのはここからです。 dllにある関数をソースで使って、無事コンパイルして、さあリンクしてexeを作りましょう、 というときに、リンカ(リンクを行うプログラム)は、 「そんな関数、実体がないぞ」 って文句を言ってこないのでしょうか。 いや、リンカは、dllに実体がある関数だということを知っているはず。 でもそれって、いちいち 「この関数はどこどこにある ○○.dll というdllに書いてあります」 というふうに、リンカに教えてあげなくてはいけないのでしょうか。 (それってまさか、ソースに書くわけじゃないですよね? ) それから、 exeファイルっていうのは「この機能はdllに行わせる機能だ」ということを知っているのでしょうか。 dllに行わせる機能だということを知っているとしても、 どのディレクトリにある なんと言う名のdllに その機能が書かれていることまで知っているのでしょうか。 (でもそこまで知っていたら逆に、ディレクトリ構成の違うマシンでは実行できなくなってしまうし。) そういうような原理的なことを教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- BLACKTALON
- ベストアンサー率37% (110/293)
- fatal_error
- ベストアンサー率39% (23/58)
- BLACKTALON
- ベストアンサー率37% (110/293)
- honiyon
- ベストアンサー率37% (331/872)
補足
わかりました。ダイナミックリンクには、スタティックな方法とダイナミックな方法の二つがあるんですね。 すっきりとしました。 >いわゆるダイナミックなリンク方法のとき、3番の回答者のおっしゃるとおり、LoadLibraryの引数にはDLLファイル名を指定する必要があると言うことです。 わかりました。ダイナミックな方法のときには、DLLファイル名はソースコード中に書かなければいけない、ということですね。 なんだか、難しそうな、ダイナミックな方法のほうが良くわかってきました。 スタティックな方法のほうですが、突っ込んでいいですか。(^^; .LIBファイル中にDLLファイル名が記述されていてそれがリンク時に参照されるから、実行ファイルは、実行時になんという名のDLLを見に行くか、判断できる。 しかし、リンク時になんという名の.LIBファイルを参照すればよいのか、そしてそれはどこにあるのかは、リンクをするプログラム(リンカ)が知っていなければいけないですよね。 .LIBファイル名とそのパスはどのように教えるのでしょうか。 (私が今このサイトを見ているパソコンでは、.LIBファイルなんて2つしかないですが、開発環境のあるマシンではいくつも.LIBファイルがあるんですよね。) (回答#2より) >参考URLのLoadLibrary()のヘルプにもLoadLibrary()自体がどのDLLに記述されていてどのLIBをリンクし、どのヘッダをインクルードすればよいかが最後に書いてあります(ただし、VC++はほとんど自動でやってくれますけどね)。 VC++が自動的にやるということですが、リンク時マシンじゅうの.LIBファイルを片っ端から見に行くのでしょうか。(パスくらいは指定するんですよね? それはソースコード中に書くのではないですよね。) (すみません。しつこい奴だなどと気を悪くなさいませんように。) あと当然のことかもしれませんが、確認させてください。.LIBファイルというのはリンク時に参照されるものなので、実行時にはなくてもいいんですよね?