GStreamer Static build with JSON-GLib Included

I am attempting to build gstreamer-full-1.0.so; however, I cannot figure out how to build and include the json-glib subproject (as a static library).

I am building version 1.22.7 on Ubunut 20.04.

I have tried:

meson setup -Djson-glib=enabled <build_dir>

But this is an unrecognized flag.

Perhaps something like this (completely untested):

meson setup -Dcustom_subprojects=json-glib -Djson-glib:default_library=static` <build_dir>

?

You may need to add it to the list of libs too via -Dgst-full-libraries=...

1 Like

@tpm thanks for the quick response. That caused the library to be compiled statically; however, it didn’t include it in the gstreamer-full-1.0.so

Here is the full meson setup line I am using:

meson setup --buildtype=release --prefix <custom_prefix> --strip 
--default-library=static --wrap-mode=forcefallback -Dgst-full-libraries=video,audio,app,pbutils,sdp,webrtc,rtsp-server,json-glib,soup -Dauto_features=disabled 
-Dbase=enabled -Dgood=enabled -Dbad=enabled -Dlibnice=enabled -Dlibav=enabled -Drtsp_server=enabled -Dglib:tests=false -Dcustom_subprojects=json-glib 
-Djson-glib:default_library=static -Djson-glib:tests=false -Dpcre2:test=false -Dges=disabled -Ddevtools=disabled -Dpython=disabled 
-Dgst-plugins-base:playback=enabled -Dgst-plugins-base:app=enabled -Dgst-plugins-base:typefind=enabled -Dgst-plugins-good:soup=enabled 
-Dgst-plugins-bad:webrtc=enabled -Dgst-plugins-bad:videoparsers=enabled --force-fallback-for=gstreamer-1.0,glib,libffi,pcre2 
<custom_build_dir>

And here is the package config output gstreamer-full-1.0.pc:

prefix=<custom_prefix>
includedir=${prefix}/include
libdir=${prefix}/lib/x86_64-linux-gnu

Name: gstreamer-full-1.0
Description: gstreamer-full: gstreamer-full-1.0
Version: 1.22.7
Requires.private: gstcoreelements, gstapp, gstplayback, gsttypefindfunctions, gstsoup, gstvideoparsersbad, gstwebrtc, gstlibav, gobject-2.0, glib-2.0, gmodule-no-export-2.0, libpcre2-8, libffi
Libs: -L${libdir} -lgstreamer-full-1.0
Libs.private: -Wl,--undefined=gst_init_static_plugins -pthread -lm -ldl
Cflags: -I${includedir}/gstreamer-1.0

Even if I bypass this issue entirely by installing and linking against the apt package for json-glib, I get a ton of linker errors like the following:

libcustom.so: undefined reference to `soup_websocket_connection_send_text'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_latency'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_stop_on_disconnect'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_framerate_num'
libcustom.so: undefined reference to `gst_discoverer_container_info_get_type'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_width'
libcustom.so: undefined reference to `gst_rtsp_server_new'
libcustom.so: undefined reference to `gst_rtsp_media_set_reusable'
libcustom.so: undefined reference to `gst_rtsp_mount_points_add_factory'
libcustom.so: undefined reference to `gst_discoverer_info_get_stream_info'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_height'
libcustom.so: undefined reference to `soup_server_new'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_suspend_mode'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_shared'
libcustom.so: undefined reference to `soup_buffer_free'
libcustom.so: undefined reference to `gst_discoverer_stream_info_get_next'
libcustom.so: undefined reference to `gst_discoverer_stream_info_get_caps'
libcustom.so: undefined reference to `soup_message_set_status'
libcustom.so: undefined reference to `soup_buffer_new'
libcustom.so: undefined reference to `soup_server_listen_all'
libcustom.so: undefined reference to `gst_rtsp_media_prepare'
libcustom.so: undefined reference to `gst_discoverer_container_info_get_streams'
libcustom.so: undefined reference to `gst_discoverer_stream_info_get_type'
libcustom.so: undefined reference to `soup_client_context_get_host'
libcustom.so: undefined reference to `gst_rtsp_server_attach'
libcustom.so: undefined reference to `gst_discoverer_discover_uri'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_buffer_size'
libcustom.so: undefined reference to `gst_rtsp_media_factory_new'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_transport_mode'
libcustom.so: undefined reference to `soup_server_set_ssl_cert_file'
libcustom.so: undefined reference to `gst_rtsp_server_set_service'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_do_retransmission'
libcustom.so: undefined reference to `gst_rtsp_media_factory_set_eos_shutdown'
libcustom.so: undefined reference to `soup_server_add_websocket_handler'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_type'
libcustom.so: undefined reference to `gst_rtsp_media_set_pipeline_state'
libcustom.so: undefined reference to `soup_message_body_append_buffer'
libcustom.so: undefined reference to `soup_server_add_handler'
libcustom.so: undefined reference to `gst_rtsp_server_get_mount_points'
libcustom.so: undefined reference to `soup_message_headers_set_content_type'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_framerate_denom'
libcustom.so: undefined reference to `gst_discoverer_new'

I’m just not sure how to debug this…

Have you tried passing the proper pkg-config name to -Dgst-full-libraries?

e.g. json-glib-1.0 and libsoup-2.4 ?

1 Like

@tpm, we are definitely getting closer!! The libraries are now in the package config file for gstreamer-full. The package config include path is correct (no more missing header errors). The number of undefined linker references was reduced:

libcustom.so: undefined reference to `soup_websocket_connection_send_text'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_framerate_num'
libcustom.so: undefined reference to `gst_discoverer_container_info_get_type'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_width'
libcustom.so: undefined reference to `gst_discoverer_info_get_stream_info'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_height'
libcustom.so: undefined reference to `soup_server_new'
libcustom.so: undefined reference to `soup_buffer_free'
libcustom.so: undefined reference to `gst_discoverer_stream_info_get_next'
libcustom.so: undefined reference to `gst_discoverer_stream_info_get_caps'
libcustom.so: undefined reference to `soup_message_set_status'
libcustom.so: undefined reference to `soup_buffer_new'
libcustom.so: undefined reference to `soup_server_listen_all'
libcustom.so: undefined reference to `gst_discoverer_container_info_get_streams'
libcustom.so: undefined reference to `gst_discoverer_stream_info_get_type'
libcustom.so: undefined reference to `soup_client_context_get_host'
libcustom.so: undefined reference to `gst_discoverer_discover_uri'
libcustom.so: undefined reference to `soup_server_set_ssl_cert_file'
libcustom.so: undefined reference to `soup_server_add_websocket_handler'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_type'
libcustom.so: undefined reference to `soup_message_body_append_buffer'
libcustom.so: undefined reference to `soup_server_add_handler'
libcustom.so: undefined reference to `soup_message_headers_set_content_type'
libcustom.so: undefined reference to `gst_discoverer_video_info_get_framerate_denom'
libcustom.so: undefined reference to `gst_discoverer_new'

I did a little digging with nm. The “soup” related symbols do exist in libsoup-2.4.a but don’t exist in gstreamer-full-1.0.so or gstreamer-full-1.0.a.

I was wrong about what I said in the previous post, libsoup-2.4 and json-glib-1.0 are NOT present in the gstreamer-full-1.0.pc file.

My meson setup line has:

"-Dgst-full-libraries=video,audio,gstreamer-app-1.0,gstreamer-pbutils-1.0,sdp,webrtc,gstreamer-rtsp-server-1.0,json-glib-1.0,libsoup-2.4"

and the resulting config:

prefix=<custom_prefix>
includedir=${prefix}/include
libdir=${prefix}/lib/x86_64-linux-gnu

Name: gstreamer-full-1.0
Description: gstreamer-full: gstreamer-full-1.0
Version: 1.22.7
Requires.private: gstcoreelements, gstapp, gstplayback, gsttypefindfunctions, gstsoup, gstvideoparsersbad, gstwebrtc, gstlibav, gobject-2.0, glib-2.0, gmodule-no-export-2.0, gstreamer-base-1.0, gstreamer-rtsp-1.0, gio-2.0, gstreamer-rtp-1.0, gstreamer-audio-1.0, gstreamer-tag-1.0, zlib, gstreamer-sdp-1.0, gstreamer-pbutils-1.0, gstreamer-video-1.0, gstreamer-net-1.0, libpcre2-8, libffi
Libs: -L${libdir} -lgstreamer-full-1.0
Libs.private: -Wl,--undefined=gst_init_static_plugins -pthread -lm -ldl
Cflags: -I${includedir}/gstreamer-1.0

This isn’t a show stopper because libsoup-2.4.pc and glib-json-1.0.pc allow me to easily statically link against them. If I do that, I am down to just the missing “gst_discoverer…” symbols.

I was finally able to resolve this by linking to 4 separate libraries:

  1. gstreamer-full-1.0.so (main shared library)
  2. json-glib-1.0.a
  3. libsoup-2.4.a
  4. gstreamer-pbutils-1.0.a

I believe 2-4 should’ve been included in 1. I’m not sure what I was doing wrong. For reference, here is my final meson setup line:

meson setup --buildtype=release --prefix <custom_prefix> --strip 
--default-library=static --wrap-mode=forcefallback -Dgst-full-libraries=video,audio,app,pbutils,sdp,webrtc,gstreamer-rtsp-server-1.0 
-Dauto_features=disabled -Dbase=enabled -Dgood=enabled -Dbad=enabled -Dlibnice=enabled -Dlibav=enabled -Drtsp_server=enabled -Dglib:tests=false 
-Dcustom_subprojects=json-glib -Djson-glib:default_library=static -Djson-glib:tests=false -Dpcre2:test=false -Dges=disabled -Ddevtools=disabled 
-Dpython=disabled -Dgst-plugins-base:playback=enabled -Dgst-plugins-base:app=enabled -Dgst-plugins-base:typefind=enabled -Dgst-plugins-good:soup=enabled 
-Dgst-plugins-bad:webrtc=enabled -Dgst-plugins-bad:videoparsers=enabled --force-fallback-for=gstreamer-1.0,glib,libffi,pcre2 
<build_dir>
1 Like

you can even pass to force_fallback_for the json-glib and then indeed you need to specify manually what libraries you want to include.

Unfortunately, this did not work for me. I tried:

meson setup --buildtype=release --prefix <custom_prefix> --strip 
--default-library=static --wrap-mode=forcefallback -Dgst-full-libraries=video,audio,app,pbutils,sdp,webrtc,rtsp-server-1.0,json-glib-1.0,soup 
-Dauto_features=disabled -Dtools=enabled -Dbase=enabled -Dgood=enabled -Dbad=enabled -Dlibnice=enabled -Dlibav=enabled -Drtsp_server=enabled -Dglib:tests=false 
-Dcustom_subprojects=json-glib -Djson-glib:default_library=static -Djson-glib:tests=false -Dpcre2:test=false -Dges=disabled -Ddevtools=disabled -Dpython=disabled
-Dgst-plugins-base:playback=enabled -Dgst-plugins-base:videotestsrc=enabled -Dgst-plugins-base:videorate=enabled -Dgst-plugins-base:videoconvertscale=enabled 
-Dgst-plugins-base:app=enabled -Dgst-plugins-base:typefind=enabled -Dgst-plugins-good:soup=enabled -Dgst-plugins-good:rtp=enabled 
-Dgst-plugins-bad:nvcodec=enabled -Dgst-plugins-bad:webrtc=enabled -Dgst-plugins-bad:videoparsers=enabled 
--force-fallback-for=gstreamer-1.0,glib,libffi,pcre2,json-glib <build_dir>

and (just removing the “1.0” suffix from rtsp-server and json-glib in gst-full-libraries):


meson setup --buildtype=release --prefix <custom_prefix> --strip 
--default-library=static --wrap-mode=forcefallback -Dgst-full-libraries=video,audio,app,pbutils,sdp,webrtc,rtsp-server,json-glib,soup 
-Dauto_features=disabled -Dtools=enabled -Dbase=enabled -Dgood=enabled -Dbad=enabled -Dlibnice=enabled -Dlibav=enabled -Drtsp_server=enabled -Dglib:tests=false 
-Dcustom_subprojects=json-glib -Djson-glib:default_library=static -Djson-glib:tests=false -Dpcre2:test=false -Dges=disabled -Ddevtools=disabled -Dpython=disabled
-Dgst-plugins-base:playback=enabled -Dgst-plugins-base:videotestsrc=enabled -Dgst-plugins-base:videorate=enabled -Dgst-plugins-base:videoconvertscale=enabled 
-Dgst-plugins-base:app=enabled -Dgst-plugins-base:typefind=enabled -Dgst-plugins-good:soup=enabled -Dgst-plugins-good:rtp=enabled 
-Dgst-plugins-bad:nvcodec=enabled -Dgst-plugins-bad:webrtc=enabled -Dgst-plugins-bad:videoparsers=enabled 
--force-fallback-for=gstreamer-1.0,glib,libffi,pcre2,json-glib <build_dir>

without -Dgst-full-libraries=...,gstreamer-rtsp-server-1.0,... I get undefined linker errors like undefined reference to gst_rtsp_server_new. Could this be related to the difference between “libraries” and “plugins”? For example, the difference in libgstapp-1.0.a (in <prefix>/lib/x86_64-linux-gnu) and libgstapp.a (in <prefix>/lib/x86_64-linux-gnu/gstreamer-1.0.

without linking directly to json-glib-1.0.a, I get missing includes for <json-glib/json-glib.h>. And this file is present in the install prefix include directory.

without linking directly to libsoup-2.4, I get the following linker error: undefined reference to soup_server_new

without linking to gstreamer-pbutils-1.0 directly, I get linker errors related to gst_discoverer_...

Could you point me to the meson logic/code that controls this? I don’t mind trying to debug but I can’t seem to find it in the GStreamer repo and I am coming from CMake…

Ok, I took a deep dive into this today. I modified my meson.build script with message(...) statements so I could figure out what is going on.

The following references the file here: meson.build (v1.22)

The core loop that populates the exposed_libs array:

  foreach pkgname_library : all_libraries
    pkg_name = pkgname_library[0]
    lib_def = pkgname_library[1]

    if pkg_name in wanted_libs or all_libs
      if lib_def.has_key('lib')
        exposed_deps += dependency(pkg_name)
        incdir_deps += dependency(pkg_name).partial_dependency(includes: true, sources: true)
        exposed_libs += [lib_def['lib']]
      endif

      if lib_def.has_key('gir')
        exposed_girs += lib_def['gir']
      endif
    endif
  endforeach

Where wanted_libs is populated by:

wanted_libs = ['gstreamer-1.0'] + get_option('gst-full-libraries')

I added the statement message('here', pkg_name) to the core loop above and the output was:

Message: here gstreamer-1.0
Message: here gstreamer-base-1.0
Message: here gstreamer-controller-1.0
Message: here gstreamer-net-1.0
Message: here gstreamer-tag-1.0
Message: here gstreamer-fft-1.0
Message: here gstreamer-video-1.0
Message: here gstreamer-audio-1.0
Message: here gstreamer-rtp-1.0
Message: here gstreamer-pbutils-1.0
Message: here gstreamer-sdp-1.0
Message: here gstreamer-rtsp-1.0
Message: here gstreamer-riff-1.0
Message: here gstreamer-app-1.0
Message: here gstreamer-allocators-1.0
Message: here gstreamer-downloader-1.0
Message: here gstreamer-adaptivedemux-1.0
Message: here gstreamer-bad-audio-1.0
Message: here gstreamer-codecparsers-1.0
Message: here gstreamer-codecs-1.0
Message: here gstreamer-cuda-1.0
Message: here gstreamer-insertbin-1.0
Message: here gstreamer-photography-1.0
Message: here gstreamer-mpegts-1.0
Message: here gstreamer-play-1.0
Message: here gstreamer-player-1.0
Message: here gstreamer-sctp-1.0
Message: here gstreamer-transcoder-1.0
Message: here gstreamer-webrtc-1.0
Message: here gstreamer-webrtc-nice-1.0
Message: here gstreamer-rtsp-server-1.0

Thus, I believe these are the only options accepted by -Dgst-full-libraries. As a result, I am still not able to include json-gilb or soup. However, this discovery did prevent me from having to link directly to gstreamer-pbutils-1.0.a as this is in the list above.