[Visual C++] VC++2010 の R6034 エラー

この記事は3年以上前に書かれた記事です。情報が古い可能性があります。

この記事で書いている問題は未解決です。

VC++2010(Visual Studio 2010)で、以前のバージョンのVC++でつくられたDLLをリンクして起動すると、R6034というランタイムエラーが出ることがある。…というか出た。

状況としては、DLLとそのlibがあり、libを読み込んでコンパイル(ビルド)までは成功するが、DLLのロードをするときに実行時エラーになる感じ。

Runtime error!
Program:(モジュールのパス)\hoge.exe
R6034 An application has made attempt to load the C runtime library incorrectry.
Please contact the application’s support team for more information

Google先生にきいてみると、

C ランタイム エラー R6034
アプリケーションがマニフェストを使用しないで C ランタイム ライブラリを読み込もうとしました。…云々

とある。

マニフェストの作り方もあったので、つくり直して再度コンパイルしてみるもNG。

もしかして、ランタイム自体がない?

実行時エラーといえばランタイムがないからエラーになる、というのはありがちな話。Visual Studioが入ってるんだからそれはないと思ってたんだけど、その先入観は捨てて、あえてランタイムを入れてみる。

ということで、そのDLLというのはVC2005で作られているらしいので、VC2005の再頒布パッケージというのをこのへんから落としてきてインストールしてみる。

しかし、状況変わらず。

むー。

そもそも、以前のバージョンのVCで作られたDLLは新しいバージョンのVC(でつくられたプログラム)では使えないのか?…そんなバカな。

バージョンの違いでランタイムも違う、というのはVBでもよくあったことなので、何が違うのか調べてみた。

ここによると、VC2005では msvcrt.lib をリンクすると msvcr80.dll というのを参照するらしい。VC2010の場合は 、同様に msvcrt.lib をリンクすると msvcr100.dll というのが参照されるらしい。つまり、VC2005とVC2010では、同じ msvcrt.lib をリンクしているつもりでも、その参照先のDLL(ランタイム)が違うということね。

さらにややこしいことに、VC2005 では msvcrt.lib は msvcrt.dll を参照し、その msvcrt.dll は msvcr80.dll にスルーしていて、VC2010 では msvcrt.lib は msvcr100.dll を直接参照しているっぽいこと。さらに、VC2010 では msvcrt.dll という名前のDLLも存在していて、しかしそれは VC2005のそれとは全く別物なのだそうです(このへん、私自身の中でも混乱していて正確じゃないかもしれませんが)。

なんだそりゃ!

つまり、今回エラーになってる DLL は、VC2005でいうところの msvcr80.dll を参照している為に、VC2010のランタイムと整合性が合わずエラーになってるってことか。でも、ダイナミックリンクしてるなら、そのDLLをVC2010で使えば2010のランタイムを使うんじゃないのか?

って、その問題のDLLをよーくみたら、サイズが 500KB 近くある。

これはもしかすると、VC2005のランタイムを静的リンクしてる(ランタイムごとDLLに入れこんでる)くさい?

ちょっと、VC2005とVC2010で以下のことを試した。

  • VC2005 の Release 構成でコンパイル → 正常動作
  • VC2005 の Debug 構成でコンパイル → ランタイムエラー
  • VC2010 の Release 構成でコンパイル → ランタイムエラー
  • VC2010 の Debug 構成でコンパイル → ランタイムエラー

VCのランタイムにはデバッグ用とリリース用の2つがあるんだけど、つまりこれはVC2005のリリース用ランタイムを静的リンクしてるDLLである疑いが強い。

これはDLLの製作元に問い合せてみるしかないか。

タイトルとURLをコピーしました