この記事は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の製作元に問い合せてみるしかないか。