1

I have a C++/CLI project created with Visual Studio 2010 that targets .NET Framework 3.5 and PlatformToolset v90. Initially it requests the VC CRT of version 9.0.21022.8, but if I include atlbase.h header then it requests the VC CRT of version 9.0.30729.6161. Why does this happen? And how can I make it to target 9.0.30729.6161 without including atlbase.h?

I tried to define macroses _BIND_TO_CURRENT_CRT_VERSION=1 and _BIND_TO_CURRENT_VCLIBS_VERSION=1 but this didn't help.

4

1 に答える 1

3

バージョンは vc/include/crtassem.h によって設定され、下部に次のように表示されます。

#ifndef _CRT_ASSEMBLY_VERSION
#if _BIND_TO_CURRENT_CRT_VERSION
#define _CRT_ASSEMBLY_VERSION "9.0.30729.6161"
#else
#define _CRT_ASSEMBLY_VERSION "9.0.21022.8"
#endif
#endif

したがって、#defining _CRT_ASSEMBLY_VERSION によってバージョンを明示的にオーバーライドできるという規則があります。そうしないでください。質問で指摘したように、 #defining _BIND_TO_CURRENT_CRT_VERSION を 1 にすると、必要なバージョン文字列が得られます。

C++/CLI プロジェクトでこれに問題が発生する可能性があります。CRT インクルード ファイルを #include することなく、C++/CLI コードをコンパイルできます。したがって、皮肉なことに、リンカーによって独自のバージョンの CRT にデフォルト設定されるデフォルト バージョンになります。したがって、回避策は#include <crtassem.h>、ソース コード ファイルの 1 つを明示的に配置することです。#include atlbase.h は、CRT ヘッダーをインクルードするため、これも行いますが、もちろん大きなハンマー アプローチです。

追加のトラブルシューティングは、Project + Properties、C/C++、Advanced、Show includes = Yes から利用できます。出力ウィンドウに含まれるすべての #include ファイルのトレースが表示されます。

msvcr90.dll の最新バージョンがユーザーのマシンに展開されるようにするための追加の負担が発生することに注意してください。プログラムが見つからないか古い場合、プログラムは起動しません。

于 2012-04-21T14:26:06.170 に答える