GStreamerを静的リンクで使えないかの会
GStreamerを静的リンクで使いたい
gst-build でできるが、Windows上では上手くいかない。
GLibを静的リンクで使えるようにするパッチ
GLibはconstructorの呼出しにWin32上では DLLMain
に依存しているため、静的リンクできない。 ...組込み用のAPIを別途出せばよくない。。?
一応この問題に対処するmerge requestが既に出ている。 DLLMain
の代わりに、TLS Callbackを使って実現している。
まだmergeされていないが、機能するように見える。
ビルドした静的ライブラリのファイル名が .a になる
この挙動は意図的らしい。
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.
ひどい理由だ。。
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では静的リンクできなかったわけで対応していないのも止むなしか。。