質問: dllの呼び出され方が分かりません windowsapiの関数の呼び出しのソースコードがコンパイラによって マシン語に変換されるときに、 コンパイラはwindowsapi(dll?)が保管されているパス(dllのバイナリの先頭のポインタアドレス?)をどのようにして知るのでしょうか? 共通のルールがあるのですか? ソースコード上で呼び出す書き方は理解しています。
回答: うーんとね。 他の質問も見たんですが・・・色々疑問を持つのは悪い事じゃないんだけど、用語が結構デタラメなんですよ。正直言うと。 例えば、「c標準コンパイラ」って言った時、何を想定しています? プログラマが「標準」って聞いた時に、通常思い浮かべるのは「言語仕様」の事です。そしてc言語仕様は全然dllの存在は想定していない。それはwindowsの特徴であって、c言語自体には「全く関係がない」のです。 んで、現時点、ワールドワイドではcの「標準」言語仕様は2017年に制定(と言うか修正が入った)通称c17と呼ばれるモノです。日本国内だといまだ2000年年に制定されたc99ですね。 jis x 3010:2003 https://kikakurui.com/x3/x3010-2003-01.html そうするとですね。そもそも、多分想定してるのはmicrosoft visual c++に「付属品として」くっついて来てるc言語処理系だと思うんですが、こいつは現在のc言語の標準には従っていません。microsoftはc++が主力だと考えてる模様で、cのアップデートには全然積極的ではないのです(逆に、c++は2017年に制定されたc++17にほぼ準拠してるか、あるいは実装が終了した筈、です)。 いずれにせよ、恐らく貴方が考えている「標準」と、プログラマが認識してる「標準」は全然意味が違います。 それと、どんなライブラリ(dllを含む)を使用しようとも、貴方が書いてるプログラムとの「連動」を司るのは、コンパイラの仕事じゃないです。それを行うのはリンカ(linker)、と呼ばれる別のプログラムですね。 リンカ: http://e-words.jp/w/%e3%83%aa%e3%83%b3%e3%82%ab.html 上のページの「動的リンク」の項目も参照の事。dllはdynamic link library(動的リンクライブラリ)の事ですからね。 動的リンクの場合、リンカは、原則的にコンパイラに、実行ファイルが必要とするdllの存在をマーキングするだけ、です(linuxだとsoファイル、ってのがwindowsのdllに当たりますが)。で、大体こういう場合、あとはケツを拭いてくれるのはosの役目になります。だから所定の場所にdllが無いと、プログラムを実行した時に「xx.dllが存在しません!」とか文句を言われるわけですよ。