none
VS2005 VC++ で WIN32プロジェクトで作成したDLL の MSVCR80D.DLLがスタティックリンクできません。 RRS feed

  • 質問

  • VS2005 VC++で生成したアプリケーションが別のマシンで実行してみたところ
    「このアプリケーションの構成が正しくないため,アプリケーションを開始できませんでした」
    というエラーが表示され、実行できませんでした。

    Dependency Walkerを使って調べてみたところ、
    MSVCR80.DLL
    MSJAVA.DLL
    が見つかりませんと表示されます。


    そこでReleaseのコンパイラオプションで(/MTd)から(/MT)に変更してスタティックリンクしようと思ったのですが
    コンパイルしてもファイルサイズが変わらず、やはり上記ファイルが足りないと出ます。

    コンパイラオプションをいろいろ弄っては見たのですが、一向に静的リンクされません。

    設定は以下の用になっています。
    MFCの使用:標準 Windows ライブラリを使用する
    ATLの使用:ATLを使用しない
    ATLでCRTをできるだけ使用しない:いいえ

    再配布パッケージを利用すると動的リンクでも動作するようなのですが、
    どうしても静的リンクにしたいので、ご教授お願いします。

    2007年9月7日 2:53

すべての返信

  •  しえる さんからの引用

    そこでReleaseのコンパイラオプションで(/MTd)から(/MT)に変更してスタティックリンクしようと思ったのですが
    コンパイルしてもファイルサイズが変わらず、やはり上記ファイルが足りないと出ます。

     

    実はアプリケーション (EXE) では静的リンクできているんじゃないでしょうか?

     

    その上で,別の要因から先ほどのDLLが見つからないというエラーになっている可能性はありませんか?

    たとえば,アプリケーション (EXE) が依存している DLL が,上記 DLL に依存していても,同じようなエラーは発生しえます.

     

    その辺から調べてみてはいかがでしょう?

    Dependency Walker を使えば,どのモジュールがその DLL にリンクしているかも調べられるので,よく見直してみてください.

    2007年9月7日 4:03
  • 返信ありがとうございます。
    Dependency Walkerのツリー構成なのですが

    -******.EXE
      +KERNEL32.DLL
      +DXD9_34.DLL
      +DXD9.DLL
      +DSOUND.DLL
      +WSOCK.DLL
      +(?)MSVCR80.DLL
      -USER32.DLL
        -ADVAPI32DLL
          -SECUR32.DLL
            -NETAPI32.DLL
              -DNSAPI.DLL
                -IPHLPAPI.DLL
                  -MPRAPI.DLL
                    -SETUPAPI.DLL
                      -SHELL32.DLL
                        -SHDOCVW.DLL
                          -MSHTML.DLL
                            (?)MSJAVA.DLL


    Module
    MSVCR80.DLL  Wrror opening file 指定されたファイルが見つかりません(2)
    MSJAVA.DLL  Wrror opening file 指定されたファイルが見つかりません(2)

    ツリーの見方が間違っていたら指摘していただけると助かります。
    2007年9月7日 5:17
  • なるほど,確かにexeからMSVCR80.DLLが参照されているようですね.

     

    すくなくとも私の場合,スタティックリンクの設定を行ってスタティックリンクできいという現象に出くわしたことはありません.なのであとは設定ミスを疑うぐらいしか分からないです.

     

    現在開発中のアプリケーションではなく,新しくプロジェクトを作り直し,ランタイムライブラリを静的リンク版に変更して,それでもMSVCR80.DLLがリンクされているかどうか,もう一度確かめてみてはいかがでしょうか?

    手元の環境 (Visual Studio 2005 Team Suite SP1 英語版) で試してみましたが,Win32 ウィンドウプロジェクトから出発し,静的リンクに変更したところ,直接依存するのは user32.dll と kernel32.dll だけという exe ファイルを作ることができました.

    デフォルトから変更したのは,Release 構成のプロジェクトの設定の

    • C/C++
      • Code Generation
        • Runtime Library

    を,デフォルトの「Multi-Thread DLL (/MD)」から「Multi-Thread (/MT)」に変更しただけです.日本語版の Visual Studio 2005 では,適宜読み替えてください.

    2007年9月7日 5:46
  • 回答ありがとうございます。
    今新規プロジェクトを作成してソースファイルをコピーして
    プロパティ→リンカ→入力→特定のライブラリ無視:LIBCMT.lib
    C/C++→コード生成→ランタイムライブラリ:マルチスレッド(/MT)
    のみ変更を行いコンパイルを行ってみたのですが、
    まったく同じexeファイルが生成されてしまいました。

    一体何が問題なんでしょう・・・

    2007年9月7日 9:42
  •  しえる さんからの引用
    回答ありがとうございます。
    今新規プロジェクトを作成してソースファイルをコピーして
    プロパティ→リンカ→入力→特定のライブラリ無視:LIBCMT.lib
    C/C++→コード生成→ランタイムライブラリ:マルチスレッド(/MT)
    のみ変更を行いコンパイルを行ってみたのですが、
    まったく同じexeファイルが生成されてしまいました。

    一体何が問題なんでしょう・・・

     

    もう一度同じことをお尋ねすることになりますが,新規プロジェクトを作成し,ウィザードの生成したソースコードをコンパイルする場合はうまくいっているのでしょうか?

    2007年9月7日 10:39
  • 「マルチスレッドDLL」で作られたスタティックライブラリとリンクしているという事はありませんか?

    ソースの中で

    #pragma comment(lib, "マルチスレッドDLLで作られたLib.lib")

    と書かれていれば今回の現象になると思います。

    2007年9月7日 11:01
  • NyaRuRu様

    ご回答ありがとうございます。
    C.John様のご回答通りの事を行っておりそれが原因かと思われます。
    お付き合いいただきありがとうございました。






    C.John様

    ご回答ありがとうございます。
    まさに、そのとおりのことを行っておりました。

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

    2007年9月7日 11:06