例:VC++のソリューション内にMyLibというライブラリのプロジェクトと、A.exeのプロジェクト、B.exeのプロジェクトがある。
A.exeはMyLibをMyLib.dllとして使いたい、B.exeはMyLibは組み込んでしまいたい、という場合。
なんでそんな場合があるかというと、例えばこんな時。
A.exeは32ビット版、64ビット版をそれぞれ配布したい、MyLibはdllとして、32ビット、64ビットそれぞれ同梱して配布。さらにB.exeを同梱するがB.exeは両方とも32ビット版を同梱したい。このとき64ビット版の配布イメージではB.exeが動かない(32ビットexeから64ビット版MyLib.dllの呼び出しになるので)。
そこで「B.exeだけはMyLibを静的リンクしちゃおう」ということになる。
で問題が起こる。VC++のプロジェクトはdllプロジェクトならdllが作られ、libプロジェクトならlibが作られる。
dllプロジェクトで作られるlibファイルはlibプロジェクトの物とは違うらしく使えない。
そこで、MyLibプロジェクトはdllプロジェクトとしてdllを作りつつ、ビルド時にカスタムビルドでlibを作るようにしておく。
そしてA.exeは普通にプロジェクト参照で、B.exeはMyLibプロジェクトの参照はしないでヘッダーのインクルードとリンク時にカスタムビルドで作成したlibを入力するよう設定。
モチロンこんな面倒なことをしないでA,BどらちもMyLibを静的リンクするという選択が一番だ。
カスタムビルドでlibファイルを作るときのバッチファイルは単に以下のコマンドを打つ感じ。
「"<VCのBinフォルダ>\lib.exe" /OUT:"<出力先フォルダ>\MyLib.lib" "<中間ディレクトリ>\hoge.obj" "<中間ディレクトリ>\stdafx.obj" 」
モチロンこんな面倒なことはしないで済むような構成にした方が良い。
0 件のコメント:
コメントを投稿