...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

bud

budを使うとソースファイルの依存関係を気にせずビルドできてすごく便利.だけど,すでにコンパイルしてライブラリ化してあるものは,もっと高速にリンクだけして欲しい.そういうのに対してもソースを全部なめてるみたいでビルドがすごく遅くなる.あんまりbud使ってなかったので,こういうときはどうしたらいいのかなー.


そういえば,Dインタフェースファイルがあった.

import win32.windows;
...

みたいな test.d ファイルがあって

cd c:\d\dmd\import\win32
bud -full -clean -H windows.d w32api.d -Twin32.lib

みたいにしてライブラリファイル(.lib)とC++におけるヘッダファイルのようなもの(.di)を作った.それから,

cd c:\d\project\test
bud test.d win32.lib -Ic:\d\dmd\import

こうしたらいいのかな.あれ? win32.lib がどこにもなくても実行可能ファイルができてやがる.なんでやねん.

続き

Dインタフェースファイルには実装が含まれていないんだから exe が完成するわけはないと思うんだけどなあ.うーん,なんでこんなことになっているんだろ.単にどこかにある実装を勝手にリンクしているだけなのだろうか.それをやめさせることはできないのか? -noautoimport はなんだ?

続きの続き

win32.windows を使うからややこしくなったのかも.


2つのファイルがあって
a.d:

import b, std.stdio;
void main() {
    for (int i=0; i<b.times(); ++i) {
        writefln("hello");
    }
}

b.d:

int times() { return 3; }

まずは b.d から b.lib + b.di を作るために

bud b -H

実験的に b.d を改名して a.d から見えなくして

ren b.d _b.d

a.d と b.lib をリンクするために

bud a b.lib

これで,a.d は import b; で b.d より先に b.di を発見し,リンクに必要な情報を得ることができて,実装は b.lib の方をリンクしてくれるようだ.なるほど.