libeay32.lib にリンクするソースをビルドしようとすると。これを OpenSSL ソースからローカルに構築しました。上記の警告「LINK: warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library」が発生しました。exe をデバッグすると、システム コール (read() など) が発生するたびに、Exe がクラッシュします。いくつかの検索の後、これは「ランタイム ライブラリ」MT および MD に関連するものであることがわかりました。いくつかの理由により、openssl ソースをビルドしてもこれを修正できません。今のところ、私がやったことは、他のいくつかのライブラリに対してこれを行う必要がある特定のライブラリを無視して、エントリ「MSVCRT.lib」を保持することです。私はしたくない。他に最適なソリューションはありますか。
4 に答える
If i understand it right you are mixing a release version of OpenSSL with a debug version of your program that causes different CRT versions to be used, since you haven't posted actual settings it may be even worse that OpenSSL is using DLL CRT while your code static. Please post what kind of CRT is your program using (can be found by clicking Properties
on the project and then Configuration Properties -> C/C++ -> Code Generation -> Runtime Libarary
). Either use proper OpenSSL version (e.g. build it with debug info and linked to debug CRT) or, since you are stating you cannot recompile OpenSSL, compile your code with Multi-threaded DLL
in release without optimizations so you get a program that can be debugged and uses the same CRT as OpenSSL. That should solve it I guess.
問題は、VS でアプリケーションをランタイム /MD に動的にリンクしていることです (既定では、アプリに Visual Studio 再頒布可能パッケージを提供する必要があります)。
プロパティ -> 構成プロパティ -> C/C++ -> コード生成 -> ランタイム ライブラリ
一方、opensll lib はデフォルトでランタイムに静的にリンクします (ランタイムには、たとえば STL の実装が含まれます)。ランタイム リンクと警告を混在させるのはよくありません。この問題は、ランタイムへの動的リンクを使用して opensll ライブラリを再コンパイルすることで解決できます。
フォロー してください: http://developer.covenanteyes.com/building-openssl-for-visual-studio/
ms\nt.mak
実行前に変更\MT
し、\MD
nmake -f ms\nt.mak
nmake -f ms\nt.mak install