トップ回答者
VC++2010Expressで静的リンク

質問
-
みなさま、こん○○は。
Win/7Pro上のVC++2010Expressで以下としました。
1. Win32プロジェクトで、
2. Windowsアプリケーション・空のプロジェクト を指定して「プロジェクト ほにゃらら」を作る
3. プロジェクト ほにゃららの構成プロパティで、
3-A 全般の「文字設定」を「マルチバイト文字セット」を設定
3-B リンカ・入力の「追加の依存ファイル」に「comctl32.lib; imm32.lib」を指定
4. Cソースとヘッダ他をスクラッチで書く
この状態だと、無事にビルドを完了し、得られた ほにゃらら.EXE は期待どうりに動作します。
さて、訳あって「静的リンク」させたくて、以下としました。
5. プロジェクト ほにゃららの構成プロパティで、
5-A C/C++・コード生成の「ランタイムライブラリ」を「マルチスレッド(/MT)」を設定
こうすると、ビルドの最後、リンカが次のエラーを吐き出します。
1>odbccp32.lib(dllload.obj) : error LNK2001: 外部シンボル "__imp___vsnprintf" は未解決です。
あちこちと探って見ましたが、これの解決策に辿り着けていません。
ご教示いただければ幸いです。
回答
-
なるほど。利用者(エンドユーザー)は、PCに対しての知識が少ないので、できるだけ面倒なことを考えずに使えるようにしたいということですね。
で、あればインストーラを用意するのが一番いい解決方法だと思います。が、Expressだと、そのインストーラを作ることができないんですよねぇ。。。
とりあえずは、vc_redist を実行してもらえば、ランタイムは配布できます。DLしないとだめだった気がするので、別途ユーザーさんにはURLを。。。となってしまうのが問題ですが。。。
それを避ける場合は、WiXなどを導入して、インストーラを作成し、それで提供となります。こちらならmsi1つのファイルで配布できるし、どうすればいいかをきちんと学べば、利用者が本当に素人でも十分使えるものにできます。
利用者が本当に直感的に使えるものは、ほとんどの場合において作る側が面倒な部分をすべて背負うことになるわけですが。。。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 回答としてマーク Soft-83 2010年11月4日 11:02
すべての返信
-
関係ありそうなものが connect に2件ほど上がっています。どちらもベータ時代のものですでにクローズしてますが、別途日本語で詳細付きで上げて、さらにこんなのもあるとリンクはっておくと、改善される可能性もあります。
もしかしたら、根っこの問題は http://support.microsoft.com/kb/168251 かもしれません。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 回答の候補に設定 山本春海 2010年10月4日 7:54
-
とっちゃんさん、ご教示感謝です。
>もしかしたら、根っこの問題は http://support.microsoft.com/kb/168251 かもしれません。
>
これには気づいていました。 ただ、その日付から、関係なかろうと思ってました。
どうやらEXPRESS固有のモンダイのようですねぇ・・・・
S.Kos
-
とっちゃんさんの挙げたconnectですが、終了はしていますが、解決策は延期と外部なっています。つまり問題が解決したわけではありません。
odbccp32.libはVisual Studioに付属はしていますが、正確にはWindows SDKのファイルです。なのでExpress固有ではありません。他のエディションでも発生しますし、VS2008でも発生します。
Windowsに付属するodbccp32.dllと連動するため、なかなか変更しづらいところがあるかと。Windowsとしてはstatic linkはあまり推奨されていませんので、仕方がないかなと思います。
-
佐裕理さん、ご教示感謝です。
>なのでExpress固有ではありません。他のエディションでも発生しますし、VS2008でも発生します。
>そうですか・・・・・
>Windowsとしてはstatic linkはあまり推奨されていませんので、仕方がないかなと思います。
>これを知らない訳でもありませんが・・・重ねてご教示いただければ幸いです。
XP上のVC6による.EXEが XP・VIST・7 の上で動いています。 この開発環境を7上のVC10に移行したくて苦戦しています。 客先のXPにVC10のCRTを導入することに難点があって、静的リンクを試みたのです。
同様のモンダイに直面しておられる方々も、決して少なくないだろうと思うのですが、みなさん、どのようにしておられるのでしょう?
-
VC10ランタイムの導入に難点があるとは、どういう点でしょう?
VC8/9(VC2005/2008)のランタイムは、WinSxSを適用していたため、必須ランタイムがどれ?というのが非常に面倒となっていましたが、VC10(VS2010)では、WinSxSは取りやめたため、単純に最新バージョンをSystemディレクトリにインストールするだけのシンプルなものに戻っています(もちろん、ローカルインストールも不可能ではありませんが、VS2010ではセキュリティ更新をWindowsUpdateで行えないため推奨されていない)。
そのため、開発サイドから見ても配布の手間はかなり軽減していると思うのですが、他にも何かあるのでしょうか?
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/ -
とっちゃんさん、重ねてのご教示、感謝です。 たいへんなカメレスになってしまいましたが、貧乏ヒマ無し、ということでご容赦ください。
>VC10ランタイムの導入に難点があるとは、どういう点でしょう?
>客先のPCに(説明しても??な)ファイルを導入したくない、という、私の心理的な(?)難点がひとつあります。
今、話題としているVC6による.EXEは、MSDE(SQL/EXPRESS)へのフロントエンドで、XP/VISTA/7 を取り混ぜて、およそ150台で稼働しています。限られた業界ですが、ちょっとした人気者になってます。 ユーザー層は30代以上の女性がほとんどで、時たま実施するアップデート・ファイルへの入れ換えさえ巧くできない人もいます。
このような状況下、あなたの環境ではコレをアソコへ入れてね、とはとても・・・
つまり、必要な環境にだけランタイムを配布し導入する、その具体的手だてが見つからない、これが最も大きな難点です。 当初の話題とは少しズレてしまいましたが、重ねてのご教示がいただければ幸いです。
-
なるほど。利用者(エンドユーザー)は、PCに対しての知識が少ないので、できるだけ面倒なことを考えずに使えるようにしたいということですね。
で、あればインストーラを用意するのが一番いい解決方法だと思います。が、Expressだと、そのインストーラを作ることができないんですよねぇ。。。
とりあえずは、vc_redist を実行してもらえば、ランタイムは配布できます。DLしないとだめだった気がするので、別途ユーザーさんにはURLを。。。となってしまうのが問題ですが。。。
それを避ける場合は、WiXなどを導入して、インストーラを作成し、それで提供となります。こちらならmsi1つのファイルで配布できるし、どうすればいいかをきちんと学べば、利用者が本当に素人でも十分使えるものにできます。
利用者が本当に直感的に使えるものは、ほとんどの場合において作る側が面倒な部分をすべて背負うことになるわけですが。。。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 回答としてマーク Soft-83 2010年11月4日 11:02
-
# 神は言っている、ここで諦める定めではないと…。
ちょっとネタ気味で、これをやって正常に動作するかわからないのですが、とりあえずやってみました。
msvcrt.dllというDLL名のプロジェクトを作成し、msvcrt.cppには
__declspec(dllexport) int _cdecl _vsnprintf(){ return 0; }
の1行を書き、msvcrt.defには
EXPORTS
の2行とします。Soft-83さんの作成されているプログラムはこのmsvcrt.dllにリンク(プロジェクト参照)します。
_vsnprintf
これでコンパイルが通るようになるのではないでしょうか?
その上で、作成されたmsvcrt.dllは配布しません。代わりにC:\Windows\System32\msvcrt.dllが読み込まれることを期待しています。 -
とっちゃんさん、佐裕理さん、再々に渡るご教示、感謝です。
インストーラ・・・・かって、全てを書き起こそうとして、断念しました。 やっぱり、それなりのツールが必要ですよね。
佐裕理さんのネタ・・・・今現在、別の案件に追われてて手が離せませんが、余裕ができしだいやってみます。結果は、また報告します。
ところで、なぜこのような問いを掲げたか、ということですが、VC2010で作成した.EXEをXPで動作させるには『静的リンク』すれば良い、との書き込みを(複数)見たからなのです。 「マルチスレッド(/MT)」にしてコンパイラ・・・・でもダメ、これはなぜ? ぼくだけ? なんてところです。
けれども、お二人のご教示によれば、そもそも静的リンクは『無理』だ、と解釈するしかありません。 MSのフォーラムでMVP所有者のご意見を疑うつもりは無いのですが、どこか納得しきれないところが残ります。ご無礼のほど、ご容赦ください。
-
static link の問題は、コンパイラやVC++の問題ではなく、WindowsのSDKにあるライブラリ(odbccp32.lib)がリンクするコードに、DLLを要求するものがあるために発生します。
解決策は、このライブラリをリンクしない、要するにodbccp32.lib を必要とするコードを書かないか、DLLをリンクするかのどちらかという手段しかないため、実質的な解決手段がないということになります。何が問題というわけではなくリンクするコードに関する問題なのでどうにもなりません。少なくともわれわれ利用者にとっては。
インストーラについては、ツールで作る時代なのでそちらを検討してください。としか言えないかなぁ。。。自作エンジンも否定はしませんが、インストール先の選択一つでもいろいろと考慮すべき点がありますので。。。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/- 編集済み とっちゃんMVP 2010年10月13日 1:41 誤字修正
-
本筋じゃないけどちょっとだけ。
MSのフォーラムでMVP所有者のご意見を疑うつもりは無いのですが、どこか納得しきれないところが残ります。
Microsoft MVP だからといって正しいことしか言わないわけではありません。
Microsoft MVP だって一人のユーザーですから、知らないこともありますし、間違えて答えてしまうことがあります。
なので、疑うことは悪いことではありません。Microsoft MVP を受賞する人はコミュニティでの活動経験が豊富なはずです。
「このように考えると納得できないので、根拠を教えてほしい」と伝えれば、気軽に答えてくれると思いますよ-。
だから、無礼とか言わない方向で :-P
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 編集済み AzuleanMVP, Moderator 2010年11月4日 14:04 授→受。今更orz