循環参照なんてするな! 終わり。
…では怒られるので。
2つのDLL、Hoge.dllとPiyo.dllがあるとします。
Hoge.dllはPiyo.dllの関数を呼び、Piyo.dllはHoge.dllの関数を呼ぶ。
しかもどちらも暗黙リンクで、GetProcAddressはしたくないという困ったちゃんだとします。
想定に無理があるのは承知です。
そもそも循環参照した時点で無茶なので、その辺は目をつぶってください。
で、こういうビルド、実はできます。
Hoge.dllをビルドするときにPiyo.dllは必要ではなく、必要なのはPiyo.libであるというのがミソです。
要は、Piyo.dllとは別にPiyo.libだけ先にビルドできれば良いわけです。
というわけで、やってみましょう。
1:Piyo.libのビルド
Piyo.libのビルドに必要なのは、実はPiyo.defだけです。ソースコードすら要りません。
ビルドには、VC++に添付のlib.exeを使います。こんな感じ。
lib /DEF:Piyo.def /MACHINE:X86 /OUT:Piyo.lib
これで、カレントディレクトリにPiyo.libとPiyo.expができます。
2:Hoge.dllとHoge.libのビルド
こっちは普通にやればいいです。IDEからもできますが、コマンドラインでやってみましょう。
cl /c /FoHoge.obj Hoge.cpp
link /DEF:Hoge.def /DLL /IMPLIB:Hoge.lib /MACHINE:X86 /OUT:Hoge.dll Hoge.obj Piyo.lib
最後に Piyo.lib を付け加えています。
これで、Hoge.dll、Hoge.lib、Hoge.expができます。
3:Piyo.dllのビルド
Piyo.defの代わりにPiyo.expを使うのがポイントです。
cl /c /FoPiyo.obj Piyo.cpp
link /DLL /MACHINE:X86 /OUT:Piyo.dll Piyo.obj Hoge.lib Piyo.exp
晴れて循環参照がクリアできました。
ちなみに、エクスポートする関数には明示的に extern "C" をつける必要があるので注意してください。
なお、改めて言わなくてもわかってると思いますが、これは興味本位で調べたことであって、そもそもやるべきことではありません。