NTEmacsビルド(24.4) 依存DLLの特定
参考
Dependency Walker http://www.dependencywalker.com/ によって依存DLLの特定ができるという情報もあったが、使い方がよくわからず、こちらはできていない
依存DLLの特定
MSYS2がインストールされていないPCでも動作可能にする為、依存するDLLを emacsのexeファイルがあるフォルダにコピーしたい。
DLLの特定を行う。
まず、Windowsの環境変数 PATH に入っているフォルダからは、dllが読み込まれてしまうので、一旦 MSYS2関連のパス(C:\msys32\usr\bin\;C:\msys32\mingw32\bin;)を取っ払って一旦ログオフする。
この状態だと、システムエラー「コンピューターに libwinpthread-1.dll がないため、プログラムを開始できません。この問題を解決するためには、プログラムを再インストールしてみてください。」が表示される。
よって、まずは、C:\msys32\mingw32\bin から libwinpthread-1.dll をbinにコピー。
この状態でも、以下の4点の問題がある。
- gif が表示できない
- jpg が表示できない
- png が表示できない
- ewwが使えない (libxml2 library not found という表示が出る)
まずは下記変数を評価し、必要な可能性のあるDLLをピックアップ
dynamic-library-alist
((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll") (png "libpng16.dll" "libpng16-16.dll") (tiff "libtiff-5.dll" "libtiff3.dll" "libtiff.dll") (jpeg "libjpeg-8.dll") (gif "libgif-7.dll") (svg "librsvg-2-2.dll") (gdk-pixbuf "libgdk_pixbuf-2.0-0.dll") (glib "libglib-2.0-0.dll") (gobject "libgobject-2.0-0.dll") (gnutls "libgnutls-28.dll" "libgnutls-26.dll") (libxml2 "libxml2-2.dll" "libxml2.dll") (zlib "zlib1.dll" "libz-1.dll"))
これらをコピーする。
- C:\msys32\mingw32\bin から
- libXpm-noX4.dll
- libpng16-16.dll
- libtiff-5.dll
- libjpeg-8.dll
- libgif-7.dll
- libgdk_pixbuf-2.0-0.dll
- libglib-2.0-0.dll
- libgobject-2.0-0.dll
- libgnutls-28.dll
- libxml2-2.dll
- zlib1.dll
- C:\msys32\bin から
- libtiff3.dll
- librsvg-2-2.dll
- 存在しない
- libxpm.dll
- xpm4.dll
- libpng16.dll
- libtiff.dll
- libgnutls-26.dll
- libxml2.dll
- libz-1.dll
これにより、1. は解決。
これ以外は、おそらく、C:\msys32\mingw32\bin 以下のDLLに依存すると推測。 まずは、C:\msys32\mingw32\bin のみにパスを通して試してみる。 1〜4 全てOK。
なので、再度パスを外し、C:\msys32\mingw32\bin 以下のDLLを全てコピーしてみる。 これでもOK。まず、これは間違いない。
なので、DLLをちょっとずつ外していき、その都度emacsを起動して、1/2/3/4の現象がどうなるかを見ていく。
1個ずつだとさすがに時間がかかりすぎるので、10個ずつやっていく。 すると、ある10個を外すと、2,3,4が一気にNGになる。 その10個が下記。
- libfribidi-0.dll
- libgadu-3.dll
- libgailutil-18.dll
- libgailutil-3-0.dll
- libgcc_s_dw2-1.dll
- libgcrypt-20.dll
- libgdbm-4.dll
- libgdbm_compat-4.dll
- libgdk-3-0.dll
- libgdk_pixbuf-2.0-0.dll
そのうち、すでにある、libgdk_pixbuf-2.0-0.dll を外す。 残り9個。
- libfribidi-0.dll
- libgadu-3.dll
- libgailutil-18.dll
- libgailutil-3-0.dll
- libgcc_s_dw2-1.dll
- libgcrypt-20.dll
- libgdbm-4.dll
- libgdbm_compat-4.dll
- libgdk-3-0.dll
今度は1個ずつ入れていき、確認。 libgcc_s_dw2-1.dll によって、2.が解決。 確かに、明らかにこいつは怪しそう。。
3.と4.に必要なDLLを特定する。 やりにくくなってきたので、これまで特定したDLLはパスの通ったディレクトリに置いておき、10個ずつ削除作戦を行う。
途中で、libxml2 が libiconv-2.dll に依存していることに気付く。 これにより、4.がOK。
また、3.は単純なミスで、入れたつもりで libpng16-16.dll を入れてなかった。 これにより、3.もOK。
再度確認してみると、2.と3.と4. が libgcc_s_dw2-1.dll に依存している。
MSYS2のライブラリの多くが、これに依存しているのかもしれない。