none
VC++2010Expressで静的リンク RRS feed

  • 質問

  • みなさま、こん○○は。
     
    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" は未解決です。
     
    あちこちと探って見ましたが、これの解決策に辿り着けていません。
    ご教示いただければ幸いです。

    2010年9月22日 6:15

回答

  • なるほど。利用者(エンドユーザー)は、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
    2010年10月9日 13:04

すべての返信

  • https://connect.microsoft.com/VisualStudio/feedback/details/470376/odbc-application-linking-with-odbccp32-lib-gets-link-errors-in-vs2010-beta-1?wa=wsignin1.0

    https://connect.microsoft.com/VisualStudio/feedback/details/509217/deprecated-vsnprintf-referenced-in-odbccp32-lib?wa=wsignin1.0

    関係ありそうなものが 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
    2010年9月22日 7:20
  • とっちゃんさん、ご教示感謝です。

    >もしかしたら、根っこの問題は http://support.microsoft.com/kb/168251 かもしれません。

    >

    これには気づいていました。 ただ、その日付から、関係なかろうと思ってました。

    どうやらEXPRESS固有のモンダイのようですねぇ・・・・

    S.Kos

     

    2010年9月25日 12:15
  • とっちゃんさんの挙げたconnectですが、終了はしていますが、解決策は延期と外部なっています。つまり問題が解決したわけではありません。
    odbccp32.libはVisual Studioに付属はしていますが、正確にはWindows SDKのファイルです。なのでExpress固有ではありません。他のエディションでも発生しますし、VS2008でも発生します。
    Windowsに付属するodbccp32.dllと連動するため、なかなか変更しづらいところがあるかと。

    Windowsとしてはstatic linkはあまり推奨されていませんので、仕方がないかなと思います。

    2010年9月25日 14:21
  • 佐裕理さん、ご教示感謝です。

    >なのでExpress固有ではありません。他のエディションでも発生しますし、VS2008でも発生します。
    >

    そうですか・・・・・

    >Windowsとしてはstatic linkはあまり推奨されていませんので、仕方がないかなと思います。
    >

    これを知らない訳でもありませんが・・・重ねてご教示いただければ幸いです。

    XP上のVC6による.EXEが XP・VIST・7 の上で動いています。 この開発環境を7上のVC10に移行したくて苦戦しています。 客先のXPにVC10のCRTを導入することに難点があって、静的リンクを試みたのです。

    同様のモンダイに直面しておられる方々も、決して少なくないだろうと思うのですが、みなさん、どのようにしておられるのでしょう?

     

    2010年9月28日 10:35
  • VC10ランタイムの導入に難点があるとは、どういう点でしょう?

    VC8/9(VC2005/2008)のランタイムは、WinSxSを適用していたため、必須ランタイムがどれ?というのが非常に面倒となっていましたが、VC10(VS2010)では、WinSxSは取りやめたため、単純に最新バージョンをSystemディレクトリにインストールするだけのシンプルなものに戻っています(もちろん、ローカルインストールも不可能ではありませんが、VS2010ではセキュリティ更新をWindowsUpdateで行えないため推奨されていない)。

    そのため、開発サイドから見ても配布の手間はかなり軽減していると思うのですが、他にも何かあるのでしょうか?


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2010年9月28日 13:01
  • とっちゃんさん、重ねてのご教示、感謝です。 たいへんなカメレスになってしまいましたが、貧乏ヒマ無し、ということでご容赦ください。

    >VC10ランタイムの導入に難点があるとは、どういう点でしょう?
    >

    客先のPCに(説明しても??な)ファイルを導入したくない、という、私の心理的な(?)難点がひとつあります。

    今、話題としているVC6による.EXEは、MSDE(SQL/EXPRESS)へのフロントエンドで、XP/VISTA/7 を取り混ぜて、およそ150台で稼働しています。限られた業界ですが、ちょっとした人気者になってます。 ユーザー層は30代以上の女性がほとんどで、時たま実施するアップデート・ファイルへの入れ換えさえ巧くできない人もいます。

    このような状況下、あなたの環境ではコレをアソコへ入れてね、とはとても・・・

    つまり、必要な環境にだけランタイムを配布し導入する、その具体的手だてが見つからない、これが最も大きな難点です。 当初の話題とは少しズレてしまいましたが、重ねてのご教示がいただければ幸いです。

     

    2010年10月9日 12:32
  • なるほど。利用者(エンドユーザー)は、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
    2010年10月9日 13:04
  • # 神は言っている、ここで諦める定めではないと…。

    ちょっとネタ気味で、これをやって正常に動作するかわからないのですが、とりあえずやってみました。

    msvcrt.dllというDLL名のプロジェクトを作成し、msvcrt.cppには

    __declspec(dllexport) int _cdecl _vsnprintf(){ return 0; }

    の1行を書き、msvcrt.defには

    EXPORTS
        _vsnprintf

    の2行とします。Soft-83さんの作成されているプログラムはこのmsvcrt.dllにリンク(プロジェクト参照)します。
    これでコンパイルが通るようになるのではないでしょうか?
    その上で、作成されたmsvcrt.dllは配布しません。代わりにC:\Windows\System32\msvcrt.dllが読み込まれることを期待しています。
    2010年10月10日 0:54
  • とっちゃんさん、佐裕理さん、再々に渡るご教示、感謝です。

    インストーラ・・・・かって、全てを書き起こそうとして、断念しました。 やっぱり、それなりのツールが必要ですよね。

    佐裕理さんのネタ・・・・今現在、別の案件に追われてて手が離せませんが、余裕ができしだいやってみます。結果は、また報告します。

    ところで、なぜこのような問いを掲げたか、ということですが、VC2010で作成した.EXEをXPで動作させるには『静的リンク』すれば良い、との書き込みを(複数)見たからなのです。 「マルチスレッド(/MT)」にしてコンパイラ・・・・でもダメ、これはなぜ? ぼくだけ? なんてところです。
    けれども、お二人のご教示によれば、そもそも静的リンクは『無理』だ、と解釈するしかありません。 MSのフォーラムでMVP所有者のご意見を疑うつもりは無いのですが、どこか納得しきれないところが残ります。

    ご無礼のほど、ご容赦ください。

     

    2010年10月12日 12:35
  • static link の問題は、コンパイラやVC++の問題ではなく、WindowsのSDKにあるライブラリ(odbccp32.lib)がリンクするコードに、DLLを要求するものがあるために発生します。

    解決策は、このライブラリをリンクしない、要するにodbccp32.lib を必要とするコードを書かないか、DLLをリンクするかのどちらかという手段しかないため、実質的な解決手段がないということになります。何が問題というわけではなくリンクするコードに関する問題なのでどうにもなりません。少なくともわれわれ利用者にとっては。

    インストーラについては、ツールで作る時代なのでそちらを検討してください。としか言えないかなぁ。。。自作エンジンも否定はしませんが、インストール先の選択一つでもいろいろと考慮すべき点がありますので。。。

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2010年10月12日 14:09
  • 本筋じゃないけどちょっとだけ。

    MSのフォーラムでMVP所有者のご意見を疑うつもりは無いのですが、どこか納得しきれないところが残ります。 

    Microsoft MVP だからといって正しいことしか言わないわけではありません。
    Microsoft MVP だって一人のユーザーですから、知らないこともありますし、間違えて答えてしまうことがあります。
    なので、疑うことは悪いことではありません。

    Microsoft MVP を受賞する人はコミュニティでの活動経験が豊富なはずです。
    「このように考えると納得できないので、根拠を教えてほしい」と伝えれば、気軽に答えてくれると思いますよ-。
    だから、無礼とか言わない方向で :-P


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年10月12日 14:55
    モデレータ
  • こんにちは、みなさま。 超々カメレスになってしまいました。 ご容赦ください。

    とっちゃんさん、重ねてのご教示感謝です。 確かに"odbccp32.libにリンクしないコード"なら、モンダイないわけです。 ついついうっかりしてました。

    Azuleanさん、ご指摘の点、肯くことばかりです。 パソ通時代から様々な部屋に出入りしていますが、ここのみなさまは、確かに「大人」ですね!
    今回は、いったんここで閉じます。佐裕理さんのネタを含めて、後日改めて投稿します。

    みなさま、ほんとうにありがとうございました。

    2010年11月4日 11:01