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 の方をリンクしてくれるようだ.なるほど.