9752


現在、C++でライブラリを作成していますが、Debug版とRelease版では別々のlibで出力されており、そのため使用時はDebug版とRelease版で、リンク時にlibファイルのパスを変更する必要があります。

しかし外部のライブラリを見ると、Debug版もRelease版も同じlibファイルを使っている場合が見受けられます。（Release版がDebug時に使えるのか、と思い試してみましたがやはり無理でした）

このように1つのlibファイルでDebug版もRelease版も網羅できるような作りにするにはどうすればいいのでしょうか？

追記：

開発環境  
Windows 7 Professional SP1  
Visual Studio 2013 Community


CC BY-SA 3.0
2015-04-30T13:00:56.080
9699
2015-05-03T07:35:27.217
2015-05-01T11:53:02.457
49
195
question
c++ visual-studio
Debug版とRelease版で同じLibファイルにする方法


C++プロジェクトではRelease版バイナリとDebug版バイナリの共用は避けたほうがよいです。混在させるとアプリケーションのリンク時に、C(C++)ランタイムライブラリの不整合エラーが発生するはずです。

アプリケーション側のプロジェクトでCランタイムライブラリを[強引に変更](https://msdn.microsoft.com/ja-
jp/library/3tz4da4a.aspx)することもできますが、メモリ確保/解放処理(`new`/`delete`など)の不整合やC++標準ライブラリのABI非互換により不可解なクラッシュを引き起こすリスクがあります。

* * *

ターゲットがダイナミックリンクライブラリ（拡張子dll）であり、全てのエクスポート関数をCリンケージ(`extern
"C"`)としているなら、Release版バイナリだけ用意すれば十分なケースが多いです。dllと同時にインポートライブラリ（拡張子lib）が生成されますが、このファイルはアプリケーションのDebugビルドで普通に使えると思います。

ただし、この場合でもメモリ確保/解放処理は、必ずメモリ確保を行った側で解放処理を行ってください。つまりアプリ側で確保したメモリはアプリ側コードで解放し、DLL側で確保したメモリはDLL側コードで解放しないと前掲の不整合クラッシュを引き起こします。


CC BY-SA 3.0
2015-05-01T14:00:17.183
9752
2015-05-01T14:11:20.330
2015-05-01T14:11:20.330
49
49
9699
answer


Visual
C++のランタイムライブラリ（libcmt.libやmsvcrt.lib）を一切使わない、という限られた条件の下でのみ、そのようなDebug/Releaseで共有できるライブラリを作成可能ではないかと思います。純粋な計算処理のみのコード、Windows
APIなどを直接使用するのみのコード、そもそもCやC++ではなくアセンブリ言語などで書いたコードなどが該当しうるでしょう

そのようなコードを書いたとして、実際にDebug/Releaseなどの区別なくリンクできるようにするには、[/Zl
(既定のライブラリ名の省略)](https://msdn.microsoft.com/ja-
jp/library/f1tbxcxh%28v=vs.120%29.aspx)を追加すると良いです。すると、ランタイムライブラリへの参照を含まないオブジェクトファイル(obj)が作成できます。これを静的ライブラリ(lib)にすれば良いです。


CC BY-SA 3.0
2015-05-02T12:51:10.033
9774
2015-05-03T07:35:27.217
2015-05-03T07:35:27.217
8616
8616
9699
answer