6

私のVS2012では、v90、v100、v110、v110_xpの4つのツールセットを利用できます。testlib(静的ライブラリ)とtestexe(コンソールアプリケーション)の2つのプロジェクトで簡単なテストを行いました。インターフェイスは、署名付きの1つの関数にすぎませんでしたvoid test()。結果:

  • testlib(v90)、testexe(v90以外)->リンクしません
  • testlib(v100)、testexe(v110またはv110_xp)->リンクします

ただし、v100とv110がリンクするのは少し奇妙に思えたので、シナリオを少し複雑にしようとしました。これで、私のメソッドは次のようになりますstd::map<std::string, std::string> test(const std::string& arg)。予想どおり、testlib(v100)とtestexe(v110)はリンクしません(mismatch detected for '_MSC_VER')。

ただし、testlib(v110)とtestexe(v110_xp)はリンクし、結果のexeはWindowsXPで動作します。これは偶然ですか、それともサポートされているシナリオですか?これが偶然の場合は、v110_xpで使用可能な機能のみを使用し、この互換性を破るサンプルコードを歓迎します。ライブラリの2つのバージョンをクライアントにデプロイする必要があるのか​​、それともv110でコンパイルされたバージョンだけをデプロイするのか疑問に思っています。

4

3 に答える 3

12

「ツールセット」という言葉は、v110とv110_xpの違いを説明するためのちょっとした誤称です。まだ同じビルドツールを使用しています。そして、あなたはまだ同じバージョンのCRTを持っています。2つのビルド間でロードされたDLLのデバッグ+Windows+モジュールリストに表示されるものを比較することで確認できるもの。msvcr110.dllの名前と場所に注意してください。

CRTは実際にはUpdate1によって更新され、XPと新しいWindowsバージョンの両方をサポートするようになりました。これは、GetProcAddress()を使用して、実行時に後のwinapi関数に動的にバインドし、XPで実行したときにそれらが見つからない場合に足を引きずることによって機能します。

異なるのは、WindowsSDKの別のバージョンを入手したことです。XPバージョン7.1とまだ互換性があった最後のもの。これは、C:\ Program Files(x86)\ Microsoft SDKs \ Windows\v7.1Aにあります。v110ツールセットを使用してビルドする場合は、C:\ Program Files(x86)\ Windows Kits\8.0に保存されているSDKインクルードファイルとライブラリファイルを使用します。

v110_xpを使用した場合の特定の変更は、c:\ program files(x86)\msbuildディレクトリでその文字列を検索すると表示されます。

  • includeファイルやlibファイルなどのディレクトリがWindows7.1SDKパスに変更されます
  • _USING_V110_SDK71_プリプロセッサシンボルが追加されましたが、重要な場所では使用されていません
  • リンカの/SUBSYSTEMオプションは、XPバージョン番号であるWindowsバージョン5.02のみを必要とするように変更されています。

簡単に言うと、v110ツールセットとv110_xpツールセットを組み合わせて構築されたモジュールの混合は問題ではありません。

于 2013-01-20T17:08:51.473 に答える
5

v110_xp実行可能ファイルとv110ライブラリの混合は公式にはサポートされていません。

この問題をMicrosoftと個別にエスカレーションした後、彼らは次の質問に答えました。

Q1:これらのライブラリ(v110)を使用し、ツールセットv110_xpで構築されたアプリケーションは、Windows XPマシンで正しく実行できますか?

Windows XPマシンで正しく実行できるのは、v110_xpツールセットでビルドされた実行可能ファイルのみです。その結果、アプリケーションをWindows XPマシンで正しく実行する必要がある場合は、プロジェクトがデフォルトのv110ツールセットからプロジェクトのプロパティページ内に新しく導入されたv110_xpツールセットに切り替えられていることを確認する必要があります。あります。

Q2:ツールセットv110_xpで構築されたこれらのライブラリの別のバージョンをリリースする必要がありますか?

これは、アプリケーションをデプロイする必要があるプラットフォームの種類によって異なると思います。展開計画にWindowsXPマシンが含まれている場合は、v110_xpツールセットで構築された実行可能ファイル/DLLの新しいバージョンをリリースする必要があります。ただし、v110_xpツールセットでビルドされた同じ実行可能ファイル/ DLLがVista以降でも実行されることを考慮すると、v110_xpツールセットでビルドされた実行可能ファイル/ DLLの単一バージョンを保持でき、これは他のすべてのプラットフォームで実行できることをお勧めします。Windows XPが展開計画に含まれなくなったら、実行可能ファイル/DLL全体をv110ツールセットで再構築するように変換できます。確かに、Windows XPと他のシステムを別々にターゲットにしたい場合は、2つのバージョンの実行可能ファイル/DLLを同時に維持できると便利です。

Q3:Microsoftは、Windows XPでツールセットv110を使用して構築されたライブラリをサポートしていますか?

答えはいいえだ。Windows XPでアプリケーションを適切に実行するには、すべてをv110_xpモードで構築する必要があります。

于 2013-04-10T13:15:30.587 に答える
1

クラスを持つ/エクスポートするDLLを異なるバージョンのVisualStudioと混合しないでください(マイナーなバージョンの違いもあります)。STLとMFCには、テンプレートの上に構築されたクラスがあり(クラス自体はユーザー向けにテンプレート化されていない場合があります)、異なるバージョン間のリンクやコンパイルを防ぎます。

簡単な例はCString次のとおりです。MFCとの静的リンクと動的リンクのCString実装は異なります。UnicodeとANSICStringも異なります。別の例はSTL自体です。デバッグビルドvectorはリリースビルドとは異なりvectorます。また、STLコレクションの場合、コンパイラ設定によってコンテナのサイズ/実装も変更されます(vector、などlist)。

したがって、これらのタイプのクラスをパラメーターとして持つエクスポートクラス/関数をインポートしない方がよいでしょう。(ボイドポインタの上など)不透明な方法でそれらを渡さないでください。

于 2013-01-20T16:11:46.250 に答える