Open4

GStreamerを静的リンクで使えないかの会

okuokuokuoku

GLibを静的リンクで使えるようにするパッチ

GLibはconstructorの呼出しにWin32上では DLLMain に依存しているため、静的リンクできない。 ...組込み用のAPIを別途出せばよくない。。?

一応この問題に対処するmerge requestが既に出ている。 DLLMain の代わりに、TLS Callbackを使って実現している。

https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1655

まだmergeされていないが、機能するように見える。

okuokuokuoku

ビルドした静的ライブラリのファイル名が .a になる

この挙動は意図的らしい。

https://github.com/mesonbuild/meson/blob/74ebb1ba59637487ecebf9666517bdef512df7fc/mesonbuild/build.py#L1774-L1780

By default a static library is named libfoo.a even on Windows because MSVC does not have a consistent convention for what static libraries are called. The MSVC CRT uses libfoo.lib syntax but nothing else uses it and GCC only looks for static libraries called foo.lib and libfoo.a. However, we cannot use foo.lib because that's the same as the import library. Using libfoo.a is ok because people using MSVC always pass the library filename while linking anyway.

ひどい理由だ。。

okuokuokuoku

DLLだと思ってリンクしてしまうプロジェクトが多い

というわけでビルドはできるようになったが、リンクが通らない。

[731/781] Linking target subprojects/gst-examples/webrtc/sendrecv/gst/webrtc-sendrecv.exe
FAILED: subprojects/gst-examples/webrtc/sendrecv/gst/webrtc-sendrecv.exe
"link"  /MACHINE:x64 /OUT:subprojects/gst-examples/webrtc/sendrecv/gst/webrtc-sendrecv.exe subprojects/gst-examples/webrtc/sendrecv/gst/webrtc-sendrecv.exe.p/webrtc-sendrecv.c.obj "/nologo" "/release" "/nologo" "/OPT:REF" "subprojects\gstreamer\gst\libgstreamer-1.0.a" "subprojects\glib\gobject\libgobject-2.0.a" "subprojects\libffi\src\libffi.a" "subprojects\glib\glib\libglib-2.0.a" "subprojects\proxy-libintl\libintl.a" "subprojects\glib\gmodule\libgmodule-2.0.a" "subprojects\gst-plugins-base\gst-libs\gst\sdp\libgstsdp-1.0.a" "subprojects\gst-plugins-base\gst-libs\gst\rtp\libgstrtp-1.0.a" "subprojects\gst-plugins-base\gst-libs\gst\audio\libgstaudio-1.0.a" "subprojects\gst-plugins-base\gst-libs\gst\tag\libgsttag-1.0.a" "subprojects\gstreamer\libs\gst\base\libgstbase-1.0.a" "subprojects\zlib-1.2.11\libz.a" "subprojects\orc\orc\liborc-0.4.a" "subprojects\glib\gio\libgio-2.0.a" "subprojects\gst-plugins-bad\gst-libs\gst\webrtc\libgstwebrtc-1.0.a" "subprojects\libsoup\libsoup\libsoup-2.4.a" "subprojects\libxml2-2.9.7\libxml2.a" "subprojects\sqlite-amalgamation-3320300\libsqlite3.a" "subprojects\libpsl\src\libpsl.a" "subprojects\json-glib\json-glib\libjson-glib-1.0.a" "ws2_32.lib" "ws2_32.lib" "winmm.lib" "shlwapi.lib" "dnsapi.lib" "iphlpapi.lib" "ws2_32.lib" "ws2_32.lib" "ws2_32.lib" "ws2_32.lib" "/SUBSYSTEM:CONSOLE" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "comdlg32.lib" "advapi32.lib"
   ライブラリ subprojects\gst-examples\webrtc\sendrecv\gst\webrtc-sendrecv.lib とオブジェクト subprojects\gst-examples\webrtc\sendrecv\gst\webrtc-sendrecv.exp を作成中
LINK : warning LNK4217: シンボル '_SOUP_METHOD_GET' ('libsoup-2.4.a(soup-method.c.obj)' で定義) が 'webrtc-sendrecv.c.obj' によって関数 'connect_to_websocket_server_async' 内でインポートされています
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_prep_cif が関数 g_cclosure_marshal_generic で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_call が関数 g_cclosure_marshal_generic で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_void が関数 g_cclosure_marshal_generic で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_uint32 が関数 g_cclosure_marshal_generic_va で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_sint32 が関数 g_cclosure_marshal_generic_va で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_uint64 が関数 g_cclosure_marshal_generic_va で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_sint64 が関数 g_cclosure_marshal_generic_va で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_float が関数 g_cclosure_marshal_generic_va で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_double が関数 g_cclosure_marshal_generic_va で参照されました
libgobject-2.0.a(gclosure.c.obj) : error LNK2019: 未解決の外部シンボル __imp_ffi_type_pointer が関数 g_cclosure_marshal_generic で参照されました
subprojects\gst-examples\webrtc\sendrecv\gst\webrtc-sendrecv.exe : fatal error LNK1120: 10 件の未解決の外部参照

__imp_ が先頭に付いているということは、 dllimport が付きっぱなしになっているな。。まぁGLibの仕様上Win32では静的リンクできなかったわけで対応していないのも止むなしか。。