Libnice is a software library that implements ICE and STUN protocol specifications. Common libraries that support ICE include Libjingle and Libnice. Libjingle is integrated in WebRTC, which is not convenient for independent use. Here we recommend using Libnice.
Common WebRTC servers, such as janus and licode, use libnice for P2P communication.
Libnice official website https://libnice.freedesktop.org/
Source address https://github.com/libnice/libnice
To compile under windows, meson and ninja need to be installed. After installation, you need to configure the environment variable in the PATH, and make sure you can find this application when you type the command meson or ninja. Meson is a tool similar to cmake, which is implemented with python3, and the Python version must be 3.6 or higher.
C:\windows> cd D:\\ibnice-master enter the source code root directory
D:\libnice-master> meson build Executing this command in the root directory will create a build directory in the new directory. cmake is to enter the build directory, execute cmake ../ in the build directory and then generate a Makefile file.
D:\libnice-master> ninja -C build Compile with ninja, build is the name of the directory
Libnice depends on the glib library. The source code download address of the glib library is https://download.gnome.org/sources/glib/2.67/
Executing meson build will cause an error because the openssl or gnuTLS library cannot be found. It does not matter. The key is to modify the meson.build file in the root directory. The compilation of openssl will not be introduced here, you can Baidu by yourself.
nice_incs = include_directories('.','agent','random','socket','stun','D:\devel\openssl-master\include') Add -I header file search directory
libcrypto_dep = cc.find_library('crypto', required: false, dirs:'D:\devel\openssl-OpenSSL_1_1_0k') Find the crypto library in the specified directory, essentially looking for the file libcrypto.a, and openssl compiled under windows The library is libcrypto.lib, we can change the file suffix to the end of .a. In other respects, I have not encountered other problems. Everyone's environment is different. Maybe the problems you have encountered are inconsistent with mine.
I posted below the contents of the meson.build file in my root directory:
project('libnice', 'c',
version: '0.1.18.1',
meson_version : '>= 0.52',
default_options : ['warning_level=1', 'buildtype=debugoptimized'])
nice_version = meson.project_version()
version_arr = nice_version.split('.')
version_major = version_arr[0]
version_minor = version_arr[1]
version_micro = version_arr[2]
if version_arr.length() == 4
version_nano = version_arr[3]
else
version_nano = 0
endif
# maintain compatibility with the previous libtool versioning
# libversion has 3 parts A.B.C
# A is the ABI version, change it if the ABI is broken, changing it resets B and C to 0. It matches soversion
# B is the ABI age, change it on new APIs that don't break existing ones, changing it resets C to 0
# C is the revision, change on new updates that don't change APIs
soversion = 10
libversion = '10.11.0'
glib_req = '>= 2.54'
gnutls_req = '>= 2.12.0'
gupnp_igd_req = '>= 0.2.4'
gst_req = '>= 1.0.0'
nice_datadir = join_paths(get_option('prefix'), get_option('datadir'))
cc = meson.get_compiler('c')
syslibs = []
if cc.get_id() == 'msvc'
add_project_arguments(
cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8
language : 'c')
endif
if host_machine.system() == 'windows'
syslibs += [cc.find_library('iphlpapi')]
syslibs += [cc.find_library('ws2_32')]
elif host_machine.system() == 'sunos'
add_project_arguments('-D_XOPEN_SOURCE=600', language: 'c')
add_project_arguments('-D__EXTENSIONS__=1', language: 'c')
# inet_pton() is only used by the tests
syslibs += [cc.find_library('nsl')]
if not cc.has_function('inet_pton')
libnsl = cc.find_library('nsl', required: false)
if libnsl.found() and cc.has_function('inet_pton', dependencies: libnsl)
syslibs += [libnsl]
endif
endif
if not cc.has_function('socket')
libsocket = cc.find_library('socket', required: false)
libinet = cc.find_library('inet', required: false)
if cc.has_function('socket', dependencies: libsocket)
syslibs += [libsocket]
elif cc.has_function('socket', dependencies: libinet)
syslibs += [libinet]
else
error('Could not find right library for socket() on Solaris')
endif
endif
endif
if not cc.has_function('clock_gettime')
librt = cc.find_library('rt', required: false)
if cc.has_function('clock_gettime', dependencies: librt)
syslibs += [librt]
endif
endif
glib_req_minmax_str = glib_req.split().get(1).underscorify()
add_project_arguments('-D_GNU_SOURCE',
'-DHAVE_CONFIG_H',
'-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_' + glib_req_minmax_str,
'-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_' + glib_req_minmax_str,
language: 'c')
cdata = configuration_data()
cdata.set_quoted('PACKAGE_STRING', meson.project_name())
cdata.set_quoted('PACKAGE_NAME', meson.project_name())
cdata.set_quoted('PACKAGE', meson.project_name())
cdata.set_quoted('VERSION', meson.project_version())
cdata.set('NICEAPI_EXPORT', true,
description: 'Public library function implementation')
# headers
foreach h : ['arpa/inet.h', 'net/in.h', 'netdb.h', 'ifaddrs.h', 'unistd.h']
if cc.has_header(h)
define = 'HAVE_' + h.underscorify().to_upper()
cdata.set(define, 1)
endif
endforeach
# functions
foreach f : ['poll', 'getifaddrs']
if cc.has_function(f)
define = 'HAVE_' + f.underscorify().to_upper()
cdata.set(define, 1)
endif
endforeach
if cc.has_argument('-fno-strict-aliasing')
add_project_arguments('-fno-strict-aliasing', language: 'c')
endif
# Extra compiler warnings (FIXME: not sure this makes sense to keep like this)
warning_level = get_option('warning_level').to_int()
werror = get_option('werror')
warnings = []
message('warning level: @0@'.format(warning_level))
message('werror enabled: @0@'.format(werror))
if warning_level >= 2
warnings += [
'-Wundef',
'-Wnested-externs',
'-Wwrite-strings',
'-Wpointer-arith',
'-Wmissing-declarations',
'-Wmissing-prototypes',
'-Wstrict-prototypes',
'-Wredundant-decls',
'-Wno-unused-parameter',
'-Wno-missing-field-initializers',
'-Wdeclaration-after-statement',
'-Wformat=2',
'-Wold-style-definition',
'-Wcast-align',
'-Wformat-nonliteral',
'-Wformat-security',
]
endif
if warning_level >= 3
warnings += [
'-Wsign-compare',
'-Wstrict-aliasing',
'-Wshadow',
'-Winline',
'-Wpacked',
'-Wmissing-format-attribute',
'-Winit-self',
'-Wredundant-decls',
'-Wmissing-include-dirs',
'-Wunused-but-set-variable',
'-Warray-bounds',
]
warnings += [
'-Wswitch-default',
'-Waggregate-return',
]
endif
if werror
warnings += [
'-Wno-suggest-attribute=format',
'-Wno-cast-function-type',
]
endif
foreach w : warnings
if cc.has_argument(w)
add_project_arguments(w, language: 'c')
endif
endforeach
# Dependencies
gio_dep = dependency('gio-2.0', version: glib_req,
fallback: ['glib', 'libgio_dep'])
gio_deps = [gio_dep]
if gio_dep.type_name() == 'internal'
# A workaround for libgio_dep not having its dependencies correctly declared.
# Should be fixed in GLib 2.60.
gio_deps += [
dependency('', fallback: ['glib', 'libglib_dep']),
dependency('', fallback: ['glib', 'libgmodule_dep']),
dependency('', fallback: ['glib', 'libgobject_dep'])
]
endif
gthread_dep = dependency('gthread-2.0',
fallback: ['glib', 'libgthread_dep'])
# Cryto library
opt_cryptolib = 'openssl'
message('Crypto library requested: ' + opt_cryptolib)
if opt_cryptolib == 'openssl'
crypto_dep = dependency('openssl', required: false)
cdata.set('HAVE_OPENSSL', true)
endif
if opt_cryptolib == 'openssl'
# MSVC builds of OpenSSL does not generate pkg-config files,
# so we check for it manually here in this case, if we can't find those files
# Based on the CMake check for OpenSSL in CURL's CMakeLists.txt,
# on which headers we should check for
openssl_headers = []
foreach h : ['crypto.h', 'engine.h', 'err.h', 'pem.h', 'rsa.h', 'ssl.h', 'x509.h', 'rand.h', 'tls1.h']
openssl_headers += 'openssl/' + h
endforeach
# OpenSSL 1.1.x and 1.0.x (or earlier) have different .lib names,
# so we need to look for the correct pair
# Find either libcrypto.lib (1.1.x) or libeay32.lib (1.0.x or earlier) first
libcrypto_dep = cc.find_library('crypto', required: false, dirs: 'D:\BPlan\openssl-OpenSSL_1_1_0k')
if libcrypto_dep.found()
# Find the corresponding SSL library depending on which crypto .lib we found
libssl_dep = cc.find_library('libssl', required: false, has_headers: openssl_headers, dirs: 'D:\BPlan\openssl-OpenSSL_1_1_0k')
endif
crypto_dep = [libcrypto_dep, libssl_dep]
endif
# GStreamer
gst_dep = dependency('gstreamer-base-1.0', version: gst_req,
required: get_option('gstreamer'),
fallback : ['gstreamer', 'gst_base_dep'])
cdata.set('HAVE_GSTREAMER', gst_dep.found(), description: 'Build GStreamer plugin')
# GUPnP IGD
gupnp_igd_dep = dependency('gupnp-igd-1.0', version: gupnp_igd_req, required: get_option('gupnp'))
cdata.set('HAVE_GUPNP', gupnp_igd_dep.found(), description: 'Use the GUPnP IGD library')
libm = cc.find_library('m', required: false)
nice_incs = include_directories('.', 'agent', 'random', 'socket', 'stun', 'D:\BPlan\GMSSL-master\include')
nice_deps = gio_deps + [gthread_dep, crypto_dep, gupnp_igd_dep] + syslibs
ignored_iface_prefix = get_option('ignored-network-interface-prefix')
if ignored_iface_prefix != []
ignored_iface_prefix_quoted = []
foreach i : ignored_iface_prefix
ignored_iface_prefix_quoted += '"' + i + '"'
endforeach
cdata.set('IGNORED_IFACE_PREFIX', ','.join(ignored_iface_prefix_quoted))
endif
gir = find_program('g-ir-scanner', required : get_option('introspection'))
subdir('agent')
subdir('stun')
subdir('socket')
subdir('random')
subdir('nice')
if gst_dep.found()
subdir('gst')
endif
if build_machine.system() == 'windows'
message('Disabling gtk-doc while building on Windows')
else
if find_program('gtkdoc-scan', required: get_option('gtk_doc')).found()
subdir('docs/reference/libnice')
else
message('Not building documentation as gtk-doc was not found or disabled')
endif
endif
if not get_option('tests').disabled()
subdir('tests')
endif
if not get_option('examples').disabled()
subdir('examples')
endif
add_test_setup('valgrind',
exe_wrapper: ['valgrind',
'--leak-check=full',
'--show-reachable=no',
'--error-exitcode=1',
'--suppressions='+meson.current_source_dir()+'/tests/libnice.supp',
'--num-callers=10'],
timeout_multiplier: 10,
env: ['CK_FORK=no']
)
configure_file(output : 'config.h', configuration : cdata)