Out of Memory

ごめん、忘れてた。

目次

Blog 利用状況

ニュース

2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

シャノン@わんくま同盟北埼玉支部

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

Microsoft MVP for Windows SDK July 2007 - February 2008, Microsoft MVP for Visual C++ February 2008 - June 2009
Microsoft MVP for Windows SDK
July 2007 - February 2008
Microsoft MVP for Visual C++
February 2008 - June 2009

アクセサリ

あわせて読みたい

e-Words

アフィリエイト

記事カテゴリ

書庫

日記カテゴリ

循環参照するDLLのビルド

循環参照なんてするな! 終わり。

 

 

…では怒られるので。

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" をつける必要があるので注意してください。

なお、改めて言わなくてもわかってると思いますが、これは興味本位で調べたことであって、そもそもやるべきことではありません。

投稿日時 : 2008年1月30日 15:54

Feedback

# re: 循環参照するDLLのビルド 2008/01/30 16:15 れい

実行時に動的に呼ぶっていう方法も。

めんどくさいけど。

タイトル  
名前  
Url
コメント