質問: 現在、C++でライブラリを作成していますが、Debug版とRelease版では別々のlibで出力されており、そのため使用時はDebug版とRelease版で、リンク時にlibファイルのパスを変更する必要があります。 しかし外部のライブラリを見ると、Debug版もRelease版も同じlibファイルを使っている場合が見受けられます。(Release版がDebug時に使えるのか、と思い試してみましたがやはり無理でした) このように1つのlibファイルでDebug版もRelease版も網羅できるような作りにするにはどうすればいいのでしょうか? 追記: 開発環境 Windows 7 Professional SP1 Visual Studio 2013 Community
回答: C++プロジェクトではRelease版バイナリとDebug版バイナリの共用は避けたほうがよいです。混在させるとアプリケーションのリンク時に、C(C++)ランタイムライブラリの不整合エラーが発生するはずです。 アプリケーション側のプロジェクトでCランタイムライブラリを強引に変更することもできますが、メモリ確保/解放処理(`new`/`delete`など)の不整合やC++標準ライブラリのABI非互換により不可解なクラッシュを引き起こすリスクがあります。 ターゲットがダイナミックリンクライブラリ(拡張子dll)であり、全てのエクスポート関数をCリンケージ(`extern "C"`)としているなら、Release版バイナリだけ用意すれば十分なケースが多いです。dllと同時にインポートライブラリ(拡張子lib)が生成されますが、このファイルはアプリケーションのDebugビルドで普通に使えると思います。 ただし、この場合でもメモリ確保/解放処理は、必ずメモリ確保を行った側で解放処理を行ってください。つまりアプリ側で確保したメモリはアプリ側コードで解放し、DLL側で確保したメモリはDLL側コードで解放しないと前掲の不整合クラッシュを引き起こします。