Open raccy opened 7 years ago
libwinpthread-1.dllの依存関係が原因でした。
C++ STLのstd::threadを使っているんですけど、pthreadを使ってしまっている様子。Windowsのnativeに変更できないか調べています。
mingw-w64環境を作る際に、スレッドモデルはposixとwin32が選択可能、 例外処理機構も64bitならseh/sjlj,32bitならdwarf/sjljが選択可能ですが、 どのように構築されました?
msys2のpacmanで構築した場合は、 Alexpuxは以下の構成で提供すると言っていますね。 32-bit: threads=posix, exceptions=dwarf 64-bit: threads=posix, exceptions=seh
TDM-GCC環境は、自分では試したことはないですが、 以下のURLではこういう記述があります。
「MinGW-w64 のもうひとつの実装である TDM-GCC では, スレッドモデルには posix,例外処理には SJLJ(32bit)または SEH(64bit) が設定されているようだ。」
http://qiita.com/spiegel-im-spiegel/items/ba4e8d2418bdfe0c8049
配布版バイナリに関して、うちのWindows10環境では、 32bit版だけでなく、64bit版も認識しませんでした。
dumpbin /dependentsの結果は、 KERNEL32.dll msvcrt.dll libwinpthread-1.dll obs.dll libcurl.dll でした。
自前ビルド版の場合は、 32-bit: threads=win32, exceptions=dwarf 64-bit: threads=win32, exceptions=seh で構築したmsys環境を使用しているため、 libwinpthread-1.dllの依存関係はなく、 問題なく使用できていました。
試しにposix版のmingwのbin配下にあるlibwinpthread-1.dllの32bit版と64bit版のdllを、 rtmp-nicolive.dllの32bit版と64bit版のそれぞれの存在しているフォルダにコピーすると、 ニコ生プラグインを認識しました。
LoadLibrary failed for '../../obs-plugins/32bit/rtmp-nicolive.dll': %1 is not a valid Win32 application.
上記のメッセージに関して、追加の情報です。 GCCでビルドした libcurl.dll の 7.55.1 をベースにして、 VS2015でビルドした rtmp-nicolive.dll の「32bit版」を「OBS公式版」に組み込むと出ました。
[OBS公式版に組み込む場合] ・libcurl.dll はGCCでビルド ・rtmp-nicolive.dll はVS2015でビルド (1) libcurl 7.55.0 をベースにした rtmp-nicolive.dll の64bit版は、問題なく認識した。[OK] (2) libcurl 7.55.0 をベースにした rtmp-nicolive.dll の32bit版は、問題なく認識した。[OK] (3) libcurl 7.55.1 をベースにした rtmp-nicolive.dll の64bit版は、問題なく認識した。[OK] (4) libcurl 7.55.1 をベースにした rtmp-nicolive.dll の32bit版は、認識しなかった。[NG]
[ビルド版で同時に生成する場合] ・libcurl.dll はGCCでビルド ・rtmp-nicolive.dll はVS2015でビルド (1) libcurl 7.55.0 をベースにした rtmp-nicolive.dll の64bit版は、問題なく認識した。[OK] (2) libcurl 7.55.0 をベースにした rtmp-nicolive.dll の32bit版は、問題なく認識した。[OK] (3) libcurl 7.55.1 をベースにした rtmp-nicolive.dll の64bit版は、問題なく認識した。[OK] (4) libcurl 7.55.1 をベースにした rtmp-nicolive.dll の32bit版は、問題なく認識した。[OK]
最新のcurl 7.55.1でビルドしたら、 スレッドモデルwin32のmingw環境なのに、 libwinpthread-1.dll への依存が発生したので、 curlビルド時のconfigureのオプションに --disable-pthreads を追加してみたらその依存性が消えたので、 その状態でのバイナリをもとに試しています。
curl の 7.55.0 と 7.55.1 で挙動が変わったのは、 https://github.com/curl/curl/commit/d86e9182e41050be508a5dfbaa3f7070b817a685 の影響と思われます。
fileコマンドでは PE32 executable (DLL) (console) Intel 80386, for MS Windowsと認識しているので、正常なWin32だとは思うんですが、mingw-w64の問題なのかなー、ちょっとわからない状態です。