複数の既存の.libから.dllを作る。
既存の静的ライブラリプロジェクトの数多くなりすぎてリンク時間が長くなってきたので、グループ化&動的ライブラリ化でリンク時間を短くしたい。ここ数日ずっとやり方を調べてたんですが、わかってみたらすごく簡単でした。
やり方は、
- ライブラリビルド時に__declspec(dllexport)、他から参照するときにdeclspec(dllimport)が指定されるようにヘッダを書き換える。
- 新規にDLLプロジェクトを作成。.dllにまとめたい静的ライブラリのプロジェクトを参照設定。
- DLLプロジェクトのプロパティのリンカ⇒全般⇒ライブラリ依存関係の入力の使用を「はい」に変更。
- EXEプロジェクトの静的ライブラリへの参照を新たに作成したDLLプロジェクトへ変更する。
- リビルド!
3の項目を「はい」にするとリンカに渡すファイルが.libではなく.objに変更になります。こうしておかないと1で設定したexport情報が.dllに反映されず、.exeから参照してもリンクエラーになってしまっていてハマりました。おかげでまじめに.defファイル作ってexportする方法も調べたんですが、その後この「はい」にするだけで良いとわかって泣けました orz=3
この方法の利点は既存の静的ライブラリ構成と動的ライブラリ構成をスイッチできるソリューションを、静的ライブラリのプロジェクト側に構成を増やさず構築できる点です。ただでさえライブラリのプロジェクトが50個×プラットフォームが3つなのでもういい加減構成追加はうんざりなのです ┐( ̄〜 ̄)┌
ちなみにこの方法は既存の.libファイルから.dllを作る方法ではありません。VCのプロジェクトでビルドする必要があります。.defを使えば.libさえあれば.dll化できますが、STL(というよりはtemplate全般)はexportしない方がよかったりするので自動化は手間がかかるかも。
余談
さいきんVisualStudioが終了してくれないので何が原因か調べていったらファイルが2000個入ったプロジェクトのせいでした。ファイル減らしたら普通に閉じるようになった。というかライブラリ50個+ソース2000個のプロジェクトがあるソリューションってどんなだよ…。
2009-01-23 追記
この方法って静的ライブラリビルド時にそのライブラリが実際に.exeにリンクされるのか、.dllにリンクされるのかを考えずにdllexport/dllimportをつけておいて、.exeに直接リンクするときはローカルで定義されてるよ?って警告を無視するってことです。で、無視してリンクした.exeをよくよく見てみたら.libのdllexport情報が反映されてしまっていて.exeを.dllみたいにimportできる状態になってました。ダサい…
どなたか.exeのリンク前後あたりでexport情報を削除する方法を知っていたらコメントお願いします。調べたけどよくわかりませんでした。