127

私が現在好んで使用している C++ 環境は、無料で非常に優れた Microsoft Visual Studio 2005 Express エディションです。ときどき、リリース .exe ファイルを他の人に送信して、満足のいく結果を得ています。しかし最近、私は、喜ばしい結果が私が望むより多くの運に基づいているという不穏な発見をしました. これらのプログラムの 1 つを古い (2001 年ヴィンテージ、入念に更新されていない) XP ボックスで実行しようとすると、厄介な「システムは x.exe を実行できません」(または同様の) メッセージしか表示されませんでした。

いくつかのグーグル検索により、このツールセットでは、静的リンクを指定しても、実際には追加の .dll ファイル (msvcm80.dll など) に依存する単純な hello-world.exe になることが明らかになりました。信じられないほど精巧なバージョン スキーム システム (マニフェスト ファイルはありますか?) は、正確に正しい .dll バージョンがないと .exe を実行できません。私はこのようなものを望んでいないか、必要としていません。私は、最小公分母のWin32操作だけを行い、古いwin32 OSで実行される、昔ながらの自己完結型の.exeが欲しいだけです。

既存のツールセットでやりたいことを実行できるかどうかは誰にもわかりませんか?

ありがとうございました。

4

4 に答える 4

145

C ランタイムの場合は、プロジェクト設定に移動し、C/C++ を選択してから「コード生成」を選択します。「ランタイム ライブラリ」設定を「マルチスレッド dll」ではなく「マルチスレッド」に変更します。

他のライブラリを使用している場合は、動的にリンクされた CRT を明示的に無視するようリンカーに指示する必要がある場合があります。

于 2008-09-01T02:55:07.780 に答える
23

Visual Studio 2010 での私の経験では、DLL を必要としないようにするには 2 つの変更が必要です。プロジェクトのプロパティ ページから (ソリューション エクスプローラー ウィンドウでプロジェクト名を右クリック):

  1. [構成プロパティ] --> [全般] の下で、[MFC の使用] フィールドを [静的ライブラリで MFC を使用する] に変更します。

  2. [構成プロパティ] --> [C/C++] --> [コード生成] の下で、[ランタイム ライブラリ] フィールドを [マルチスレッド (/MT)] に変更します。

なぜ両方が必要なのかわかりません。これを使用して、glut32.dll への依存関係を削除しました。

後で追加: これらの変更を構成に加えるときは、「すべての構成」に変更する必要があります --- これは、[プロパティ] ウィンドウの上部で選択できます。デバッグ構成のみに変更を加えると、リリース構成には適用されず、その逆も同様です。

于 2016-01-24T21:27:43.850 に答える
5

私はこれと同じ依存関係の問題を抱えており、VS 8.0 DLL (リリースのみ! デバッグではありません!--- プログラムもリリースする必要があります) を適切な名前のフォルダーに含めることができることも知っています。 .exe を含む親フォルダー:

方法: XCopy を使用して展開する (MSDN)

また、静的にリンクされた同じ .exe に C++ と C コードを含める必要がある場合、問題が発生することが保証されていることに注意してください。これは、正しい libXXX.lib を無視して動的にリンクする (DLL) ことによってのみ解決できるリンカーの競合が発生するためです。 .

最後に、別のツールセット (VC++ 6.0) を使用すると、Windows 2000 以降には正しい DLL がインストールされているため、「問題なく動作」します。

于 2008-09-01T02:59:55.397 に答える
2

Jared の回答に関しては、Windows 2000 以降を使用しても、目前の問題が必ずしも解決するとは限りません。Rob の対応は機能しますが、この修正によりセキュリティ上の問題が発生する可能性があります。Windows の更新プログラムは、そのように構築されたアプリケーションにパッチを適用することができないからです。

別の投稿で、Nick Guerrera は、Visual C++ ランタイム再頒布可能パッケージをアプリケーションと一緒にパッケージ化することを提案しています。これは、すばやくインストールでき、Visual Studio から独立しています。

于 2011-06-06T18:28:58.963 に答える