Visual Studio Express 2005で完全に静的にリンクされた.exeを作成するにはどうすればよいですか?


109

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

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

既存のツールセットでやりたいことができるかどうか誰かが知っていますか?

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

回答:


126

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

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


「他のライブラリを使用している場合は、動的にリンクされたCRTを明示的に無視するようにリンカーに指示する必要がある場合があります。」最近この問題に遭遇しました。私はwxWidgetsアプリをビルドしていましたが、同じコード生成の変更でwxWidgetsライブラリを再ビルドする必要があることに気付きました
Bill Forster '12

6
男300文字は多くありません。上記のコメントが不明確な場合、問題は.cppファイルとライブラリの.cppファイルの両方に「マルチスレッドdll」ではなく「マルチスレッド」が必要であり、そうでないとリンクエラーが発生する可能性があります。
Bill Forster、

これは、おそらく何もしたくないヒープ管理に関する多くの問題を引き起こします。
Edward Strange

CRTライブラリの場合、VSは/ MDおよび/ MTオプションを提供します。しかし、一般的に他のライブラリを静的にリンクすることについてはどうでしょう-たとえば、libX.lib(自分のライブラリまたはサードパーティのライブラリである可能性があります)とは?
キランMN

4
わかりますerror LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'。ビルドのタイプを変更する他の場所はありますか?@BillForsterによく似たwxWigetsアプリケーションを構築しています。では、wxWidgets を再構築する必要がありますか?それ、どうやったら出来るの?
トマシュザト-モニカを復活させる

18

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

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

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

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

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


1
これはVisual Studio 2013で1つの小さな追加で機能するようです:構成プロパティ->全般->文字セットを "Use Unicode Character Set"に変更する必要がありました。
gnovice

4

これと同じ依存関係の問題があり、VS 8.0 DLL(リリースのみ!デバッグではありません!---プログラムもリリースする必要があります)を、 .exeを含む親フォルダー:

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

また、同じ静的にリンクされた.exeにC ++とCのコードが必要な場合は、正しく動作しないことが保証されていることに注意してください。 。

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


1

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

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


2
再頒布可能パッケージをパッケージ化することをお勧めしますが、再頒布可能インストーラを実行するには管理者特権が必要です。管理者以外のユーザーがいる場合、これは実行可能なオプションではありません。
Kevin Condon 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.