静的ライブラリのCRT依存関係を無視するようにMSVC ++を強制するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/687179

質問

これを行うことができるかどうかはわかりませんが、 /nodefaultlibを静的ライブラリプロジェクトに適用したいと思います。

一般的な静的ライブラリD.Libを使用する多くのアプリケーションプロジェクト(A.Exe、B.Dll、C.DLL)があります。このライブラリには多くのコードがあり、他の.lib依存関係もあります。そのうちの1つはOpenSSLライブラリで、CRTのリリースバージョンに対してWin32のために構築されたようです(元のプロジェクト/ソースはありません)。

これまでのところ、CRTのリリース /デバッグバージョンの混合を回避するには、すべてのLeafプロジェクト(A.Exe、B.DLL)に/NodeFaultlib:msvcrt.libリンカーディレクティブを配置する必要があります。これは機能しますが、その問題に対処する理想的な方法ではないと思います。このプロパティをD.Libプロジェクトに入れようとしましたが、効果はありません。

MSVC ++に、サードパーティライブラリからMSVCRT.LIB依存関係を無視するように強制する方法はありますか?

役に立ちましたか?

解決

.libにリンクしないため、リンカー設定がありません。リンク それ。 .libは.objファイルのアーカイブであり、圧縮されていない.zipファイルのようなものです。そのため、リンクするすべてのプロジェクトに設定を配置する必要があります。

VS2005+を使用している場合は、プロパティシートを使用して、設定を1つの場所に配置して、すべてのプロジェクトでそのプロパティシートを使用するだけで使用できます。

ただし、OpenSSLはまさにそれです。オープンソースなので、使用しているバージョンのソースを取得して再度構築できるはずです(もちろん、バージョン制御システムに追加します)。 OpenSSLはDLLまたはLIBとして構築できると思いました。これにより、DLLがコードのリンクを妨げないため、問題が解決します。

それに失敗すると、あなたは常にあなたの機能を個別のDLLにスリットするオプションがあり、あなたは1つのプロジェクトの問題しかないようにします。

他のヒント

私の理解では、ライブラリLIBが静的にDLLにリンクされた場合、DLLにはLIBからのすべての関連コードが既に含まれています。したがって、この結合は削除できません。これは、実験ではなく、静的リンクの理解に基づいています。

分散型の静的リンクライブラリを特定のMSVCランタイムライブラリに依存することを防ぐには、このコンパイラオプションを設定する必要があります(Visual Studio 2010では、そのように見えます):

構成プロパティ - > C/C ++ - > Advanced->デフォルトライブラリ名=はい(/zi)

これで、ユーザーはリリースされたstatic libにリリースされたデバッグビルドからリンクでき、問題を引き起こす誤ったランタイムライブラリやリンカーの警告にリンクしようとすることはできません。

ライブラリが実際に特定のランタイムライブラリまたはその動作に依存し、互換性のあるコンポーネントが他の方法で提供されていない場合、リンクエラーを引き起こす可能性があることに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top