2009年6月17日水曜日

vc manifest のデフォルト

  Visual Studio でコンパイルした場合と、nmake を使って手動でコンパイルした場合に、DLL が不整合を起こしているような感じなので、depends.exe で、DLL の状態を追ってみた。
mt.exe を駆使して、アセンブリの情報を DLL に埋め込むのは
C:> mt -manifest hoge.dll.manifest -outputresource:hoge.dll;2
という感じでいけるという事がわかったのだけども、デフォルトで作成される hoge.dll.manifest の中身がいただけない。
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

vc9 は sp1 なので、version='9.0.30729.1' というようになっていなければならないのである。これ、毎回手動で直せって事?どうにも、この辺の情報がよくわからなくて腹が立つ。

 何が起こっているか?推理しているところ・・・。
zlib は Visual Studio でコンパイルしたから、msvcr90.dll は 9.0.30729.1 っぽい。
それに対して libtiff では nmake でコンパイルし、mt うんぬんしたらか、msvcr90.dll と msvcp90.dll が 9.0.21022.8 っぽい。
結果、コンフリクトして msvcp90.dll が見つかりまへん・・・と、なっているのではないか?それっぽい痕跡が、ここ

 他にも、共通言語ランタイムを有効にして開発している場合に、Visual Studio で UNICODE を指定しようが、マルチバイトを指定しようが、問答無用で UNICODE が選定されてしまい、std::ifstream が問答無用で ワイド・キャラの変換をかけるみたいなのも、むかつく。

0 件のコメント: