Chapter 7 QNX Platforms

7.1 Summary of QNX Platforms and Supported Features

The following table shows the supported products/features for each architecture. A ● means supported in this release, an empty cell means unsupported in this release.

Table 7.1 QNX Systems - Supported Features

RTI Architecture [1]

Supported Features

Languages

 

Java [2]

Python [3]

.NET (C#) [4]

C/C++ [5]

Modern C++ [6], [7]

Protocol Buffers Extension [8]

 

QNX Neutrino 8.0, 8.0.2, 8.0.3 [15]

x64QNX8.0qcc_cxx12.2.0 [16]

 

 

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3 [15]

armv8QNX8.0qcc_cxx12.2.0 [16]

 

 

 

 

Transports

 

UDP/IPv4

UDP/IPv6

Multicast

TCP/IPv4

Shared Memory (w/ zero copy) [9]

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

x64QNX8.0qcc_cxx12.2.0

● [10]

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

● [10]

 

 

Infrastructure Services

 

Persistence Service

Routing Service

Recording and Replay Services

Web Integration Service

 

 

 

QNX Neutrino 8.0, 8.0.2 , 8.0.3

x64QNX8.0qcc_cxx12.2.0

 

 

 

 

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

 

 

 

 

 

 

Connext Professional Libraries

 

Request/Reply

Monitoring Library

Distributed Logger

LBED [11]

Monitoring Library 2.0

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

x64QNX8.0qcc_cxx12.2.0

See "Observability Framework" rows below

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

 

 

Core Library Features

 

Monotonic Clock

CPU Core Affinity

Durable writer history & reader state

RTI DDS thread name

Backtrace

Cmake Find Package

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

x64QNX8.0qcc_cxx12.2.0

 

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

 

 

 

Tools

 

Shapes Demo

Launcher

Monitor

Admin Console

System Designer

rtiddsgen server

Utilities (rtiddsping, rtiddsspy)

QNX Neutrino 8.0, 8.0.2, 8.0.3

x64QNX8.0qcc_cxx12.2.0

 

 

 

 

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

 

 

 

 

 

 

Observability Framework

 

Observability Collector Service

Monitoring Library 2.0

         

QNX Neutrino 8.0, 8.0.2, 8.0.3

x64QNX8.0qcc_cxx12.2.0

 

         

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

 

         

Security Extensions

 

Security Plugins (for OpenSSL) [12]

Security Plugins (for wolfSSL) [13]

TLS Support [12]

Security Plugins SDK [14]

   

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

x64QNX8.0qcc_cxx12.2.0

 

 

   

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

   

 

Add-ons

 

Cloud Discovery Service

Real-Time WAN Transport

Ada Language Support

Limited Bandwidth Plugins

Queuing Service (Experimental)

 

 

QNX Neutrino 8.0, 8.0.2, 8.0.3

x64QNX8.0qcc_cxx12.2.0

 

 

 

     

QNX Neutrino 8.0, 8.0.2, 8.0.3

armv8QNX8.0qcc_cxx12.2.0

 

 

 

     

Footnotes for the above table:

1

Supports DDS 1.4, RTPS 2.5, and DDS X-Types 1.4.

2

Built with Eclipse Temurin OpenJDK 21.0.7, compatible with Java 8 and above. Also tested with AdoptOpenJDK 17.0.6 and 25.0.1.

3

Supported on Python 3.10-3.14. Free-threaded (no-GIL) builds of CPython 3.13+ are not currently supported.

4

The C# API is provided as multi-targeted .NET Standard 2.0 and 2.1 libraries, built using the .NET 10 SDK. This allows consumption from the following runtimes, per Microsoft compatibility guidance: .NET 5 and newer, .NET Core 2.1 and newer, and .NET Framework 4.8.1 and newer. Unity projects can consume the libraries on either .NET Standard 2.0 or 2.1 profiles depending on the Unity version and API Compatibility Level settings. Unity versions 2021.2 and later include support for .NET Standard 2.1, while earlier versions target .NET Standard 2.0.

5

Supports C++98 compilers or newer.

6

Tested with C++11 unless stated otherwise.

7

Supporting Modern C++ means supporting the RPC feature unless otherwise stated.

8

Only provides mapping for Modern C++. The IDL converted from a .proto file can be used with the standard mapping in the rest of the languages.

9

Zero-copy transfer over shared memory is NOT supported for Java, Ada, .NET and Python programming languages. It is only supported for C, Traditional C++, and Modern C++ programming languages.

10

No Traffic Class support.

11

Supports dynamic linking only.

12

Tested with OpenSSL 3.5.5 unless stated otherwise.

13

Tested with WolfSSL 5.8.2.

14

Tested with both OpenSSL 3.5.5 and WolfSSL 5.8.2.

15

The earliest versions of the com.qnx.qnx800.target.microkernel.core (“QNX® SDP 8.0 Kernel and libc”) component are not supported. Please update this component in your QNX 8.0 SDP installation to version 2.0.2.00388T202406131303L or higher (“Stable (GA8.0.1) July 09, 2024”) before generating the QNX system image.

16

LLVM C++ library

7.1.1 Monotonic Clock Support

See Configuring the Clock per DomainParticipant, in the RTI Connext Core Libraries User's Manual for information on the monotonic clock.

7.1.2 Support for 'Find Package' CMake Script

For information on using the 'Find Package' CMake script, see 2.5 Building with CMake.

7.1.3 Notes about Transports

  • Shared Memory
  • The following expression can detect the two different kinds of SHMEM mutexes that RTI supports on QNX systems: posix semaphores for older QNX versions, and shared pthread mutexes for newer QNX versions, as well other shared memory resources used by Connext such as plain shared memory segments:

    ls /dev/shmem/RTIOsapiSharedMemory*

    To clean up the shared memory resources (both segments and mutexes), remove the relevant files listed in /dev/shmem/ and /dev/sem/. The shared resource names used by Connext begin with 'RTIOsapiSharedMemory'.

    The permissions for the semaphores created by Connext are modified by the process' umask value. If you want to have shared memory support between different users, run the command "umask 000" to change the default umask value to 0 before running your Connext application.

  • UDPv6: Supported. The transport is not enabled by default; the peers list must be modified to support IPv6. No Traffic Class support.
  • To use the UDPv6 transport, the network stack must provide IPv6 capability. Enabling UDPv6 may involve switching the network stack server and setting up IPv6 route entries.

7.2 Building Applications for QNX Platforms

The libraries on Arm v7 CPUs require a hardware FPU in the processor and are compatible with systems that have hard-float libc. See Table 7.10 Library-Creation Details for QNX Architectures for compiler flag details.

Table 7.2 Building Instructions for QNX Architectures lists the libraries you will need to link into your application.

Depending on which Connext features you want to use, you may need additional libraries; see  7.2.2 Additional Libraries for Other Features.

Make sure you are consistent in your use of static, dynamic, debug and release versions of the libraries. Do not link both static and dynamic libraries. Similarly, do not mix release and debug libraries.

Release and Debug Terminology:

Both release and debug versions of the libraries are provided. For Connext, debug libraries are created with debug symbols to facilitate debugging with gdb, for example. Release libraries do not contain debug information.

The Connext debug libraries are intended solely for development and debugging purposes. These libraries are not optimized for performance or resource consumption and may include additional diagnostic information that can affect runtime behavior. They are not intended for use in production environments. Please ensure that only the release libraries are used in production deployments. Debug libraries can be identified by the suffix "d" in their names.

Additional Documentation: 

You should also review the QNX chapter of the RTI Connext Core Libraries Getting Started Guide Addendum for Embedded Systems.

Verified Compiler Flags:

Compiler flags outside those documented in Table 7.2 Building Instructions for QNX Architectures have not been verified by RTI and can cause undefined behavior.

Table 7.2 Building Instructions for QNX Architectures

API

Library Format

Required RTI Libraries1, 2

Required

System Libraries

Required

Compiler Flags

C++ (Traditional and Modern APIs)

Static Release

libnddscorez.a

libnddscz.a

libnddscppz.a (or libnddscpp2z.a)

librticonnextmsgcppz.a (or librticonnextmsgcpp2z.a)

-lm -lsocket

-DRTI_QNX

Static Debug

libnddscorezd.a

libnddsczd.a

libnddscppzd.a (or libnddscpp2zd.a)

librticonnextmsgcppzd.a (or librticonnextmsgcpp2zd.a)

Dynamic Release

libnddscore.so

libnddsc.so

libnddscpp.so (or libnddscpp2.so)

librticonnextmsgcpp.so (or librticonnextmsgcpp2.so)

Dynamic Debug

libnddscored.so

libnddscd.so

libnddscppd.so (or libnddscpp2d.so)

librticonnextmsgcppd.so (or librticonnextmsgcpp2d.so)

C

Static Release

libnddscorez.a

libnddscz.a

librticonnextmsgcz.a

-lm -lsocket

For 64-bit architectures:

-DRTI_64BIT

For all architectures:

-DRTI_QNX

Static Debug

libnddscorezd.a

libnddsczd.a

librticonnextmsgczd.a

Dynamic Release

libnddscore.so

libnddsc.so

librticonnextmsgc.so

Dynamic Debug

libnddscored.so

libnddscd.so

librticonnextmsgcd.so

7.2.1 Required Change for Building with C++ Libraries

The C++ libraries for QNX platforms are built without the -frtti flag and with the -fexceptions flag. You must build your C++ applications without -fno-exceptions in order to link with the RTI libraries. In summary:

  • Do not use -fno-exceptions when building a C++ application or the build will fail.
  • It is not necessary to use -fexceptions, but doing so will not cause a problem.
  • It is not necessary to use -frtti, but doing so will not cause a problem.

7.2.2 Additional Libraries for Other Features

This section discusses libraries for features that are not supported for every platform. Refer to Table 7.1 QNX Systems - Supported Features to see if these libraries are supported on your platform.

If you plan to use the additional RTI libraries described in this section, they must be linked before the required RTI libraries (see Table 7.2 Building Instructions for QNX Architectures) in your included libraries for linking.

Make sure you are consistent in your use of static, dynamic, debug and release versions of the libraries. For example, if your Connext application is linked with the static release version of the Connext libraries, you will need to also use the static release version of the library. Do not link both static and dynamic libraries. Similarly, do not mix release and debug libraries.

7.2.2.1 Libraries Required for Distributed Logger

Table 7.3 Additional Libraries for using RTI Distributed Logger lists the additional libraries you will need in order to use Distributed Logger.

Table 7.3 Additional Libraries for using RTI Distributed Logger

Language

Static

Dynamic

Release

Debug

Release

Debug

C

librtidlcz.a

librtidlczd.a

librtidlc.so

librtidcd.so

C++ (Traditional API)

librtidlcz.a

librtidlcppz.a

librtidlczd.a

librtidlcppzd.a

librtidlc.so

librtidlcpp.so

librtidlcd.so

librtidlcppd.so

7.2.2.2 Libraries Required for Monitoring

If you are statically linking your application with DDS libraries and you want to add monitoring to your application, you will also need to statically link the monitoring library. The library cannot be loaded dynamically strictly through the QoS profile because it also depends on DDS to publish its data. Therefore, it depends on DDS; the DDS functionality would cause duplicate symbols to be found, resulting in the termination of the process.

To use dynamic libraries: make sure the permissions on the .so library files are readable by everyone.

Table 7.4 Additional Libraries for Using Monitoring

Library Format

Monitoring Libraries3

Dynamic Release

librtimonitoring.so

Dynamic Debug

librtimonitoringd.so

Static Release

librtimonitoringz.a

Static Debug

librtimonitoringzd.a

Table 7.5 Additional Libraries for Using Monitoring Library 2.0

Library Format

Monitoring Libraries 2.0 4

Dynamic Release

librtimonitoring2.so

Dynamic Debug

librtimonitoringd2.so

Static Release

librtimonitoringz2.a

Static Debug

librtimonitoringzd2.a

7.2.2.3 Libraries Required for Real-Time WAN Transport

If you choose to use RTI Real-Time WAN Transport, you must download and install a separate package that contains the transport libraries. See the RTI Connext Installation Guide for details.

Using Real-Time WAN Transport requires one of the libraries in Table 7.6 Additional Libraries for Using RTI Real-Time WAN Transport APIs. Select the file appropriate for your chosen library format.

For more information, see Enabling Real-Time WAN Transport, in the RTI Connext Core Libraries User's Manual.

Table 7.6 Additional Libraries for Using RTI Real-Time WAN Transport APIs

Library Format

Real-Time WAN Transport Libraries5

Dynamic Release

libnddsrwt.so

Dynamic Debug

libnddsrwtd.so

Static Release

libnddsrwtz.a

Static Debug

libnddsrwtzd.a

7.2.2.4 Libraries Required for TCP Transport APIs and TLS Support

To use the TCP Transport APIs, link against the additional libraries in Table 7.7 Additional Libraries for using RTI TCP Transport APIs .

Note: Not all platforms support the TCP Transport - see Chapter 7 QNX Platforms.

Table 7.7 Additional Libraries for using RTI TCP Transport APIs

Library Format

RTI TCP Transport Libraries6

 

Dynamic Release

libnddstransporttcp.so

Dynamic Debug

libnddstransporttcpd.so

Static Release

libnddstransporttcpz.a

Static Debug

libnddstransporttcpzd.a

If you are using RTI TLS Support, also see Table 7.8 Additional Libraries for using RTI TCP Transport APIs with TLS Enabled. (Select the files appropriate for your chosen library format.) See the RTI TLS Support Release Notes for a list of supported platforms.

Table 7.8 Additional Libraries for using RTI TCP Transport APIs with TLS Enabled

Library Format

RTI TLS Libraries7

OpenSSL Libraries8

Dynamic Release

libnddstls.so

libssl.so

libcrypto.so

Dynamic Debug

libnddstlsd.so

Static Release

libnddstlsz.a

Static Debug

libnddstlszd.a

7.2.2.5 Libraries Required for Zero Copy Transfer Over Shared Memory

To use the Zero Copy Transfer Over Shared Memory feature, link against the additional library in Table 7.9 Additional Libraries for Zero Copy Transfer Over Shared Memory.

Table 7.9 Additional Libraries for Zero Copy Transfer Over Shared Memory

Library Format

Zero Copy Transfer Over Shared Memory Libraries9

Dynamic Release

libnddsmetp.so

Dynamic Debug

libnddsmetpd.so

Static Release

libnddsmetpz.a

Static Debug

libnddsmetpzd.a

7.2.3 How the Connext Libraries were Built

Table 7.10 Library-Creation Details for QNX Architectures shows the compiler flags that RTI used to build the Connext libraries. This is provided strictly for informational purposes; you do not need to use these parameters to compile your application. You may find this information useful if you are involved in any in-depth debugging.

The details for building user applications are in Chapter 2 Building Applications—Notes for All Platforms.

Table 7.10 Library-Creation Details for QNX Architectures

RTI Architecture

Library Format

Compiler Flags Used by RTI

x64QNX8.0qcc_cxx12.2.0

Static Release

-Vgcc/12.2.0,gcc_ntox86_64 -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIC -fvisibility=hidden

Static Debug

-Vgcc/12.2.0,gcc_ntox86_64 -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O0 -g -fPIC

Dynamic Release

-Vgcc/12.2.0,gcc_ntox86_64 -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -flto=auto -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIE -fvisibility=hidden

Dynamic Debug

-Vgcc/12.2.0,gcc_ntox86_64 -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -g -fPIC

armv8QNX8.0qcc_cxx12.2.0

Static Release

-Vgcc/12.2.0,gcc_ntoaarch64le -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIC -fvisibility=hidden

Static Debug

-Vgcc/12.2.0,gcc_ntoaarch64le -lang-c++ -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-strict-aliasing -fno-semantic-interposition -g -fPIC

Dynamic Release

-Vgcc/12.2.0,gcc_ntoaarch64le -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O -Y_cxx -fexceptions -flto=auto -fno-strict-aliasing -fno-semantic-interposition -O -DNDEBUG -fPIC -fvisibility=hidden

Dynamic Debug

-Vgcc/12.2.0,gcc_ntoaarch64le -DFD_SETSIZE=512 -DSIZEOF_LONG=8 -O0 -Y_cxx -fexceptions -fno-strict-aliasing -fno-semantic-interposition -O0 -g -fPIC

7.3 Running Your Application

Table 7.11 Running Instructions for QNX Architectures provides details on the environment variables that must be set at run time for a QNX architecture.

Starting with Connext 6.0.1, you need the dirname tool to run the scripts in the bin directory.

Table 7.11 Running Instructions for QNX Architectures

RTI Architecture

Library Format

(Release & Debug)

Environment Variables

All supported QNX architectures

Static

None required

Dynamic

LD_LIBRARY_PATH= ${NDDSHOME}/lib/<architecture>: ${LD_LIBRARY_PATH}10

7.4 Thread Configuration

7.4.1 Thread Settings and Thread-Priority Definitions

See Table 7.12 Thread Settings for QNX Platforms and Table 7.13 Thread-Priority Definitions for QNX Platforms.

Table 7.12 Thread Settings for QNX Platforms

Applicable Thread

DDS_ThreadSettings_t

Platform-Specific Setting

Asynchronous Publisher,

Asynchronous flushing thread

mask

OS default thread type

priority

10

stack_size

64 * 1024

cpu_list

Empty CPU list (Supported on QNX platforms)

cpu_rotation

DDS_THREAD_SETTINGS_CPU_NO_ROTATION

Database thread

mask

DDS_THREAD_SETTINGS_STDIO

priority

8

stack_size

64 * 1024

cpu_list

Empty CPU list (Supported on QNX platforms)

cpu_rotation

DDS_THREAD_SETTINGS_CPU_NO_ROTATION

Event thread

mask

DDS_THREAD_SETTINGS_STDIO | DDS_THREAD_SETTINGS_FLOATING_POINT

priority

8

stack_size

4 * 64 * 1024

cpu_list

Empty CPU list (Supported on QNX platforms)

cpu_rotation

DDS_THREAD_SETTINGS_CPU_NO_ROTATION

ReceiverPool threads

mask

DDS_THREAD_SETTINGS_STDIO | DDS_THREAD_SETTINGS_FLOATING_POINT

priority

12

stack_size

4 * 64 * 1024

cpu_list

Empty CPU list (Supported on QNX platforms)

cpu_rotation

DDS_THREAD_SETTINGS_CPU_NO_ROTATION

 

Table 7.13 Thread-Priority Definitions for QNX Platforms

Thread-Priority Definition

Operating-System Priority

THREAD_PRIORITY_DEFAULT

10

THREAD_PRIORITY_HIGH

14

THREAD_PRIORITY_ABOVE_NORMAL

12

THREAD_PRIORITY_NORMAL

10

THREAD_PRIORITY_BELOW_NORMAL

8

THREAD_PRIORITY_LOW

6

7.4.2 Support for Controlling CPU Core Affinity for RTI Threads

Support for controlling CPU core affinity (described in "Controlling CPU Core Affinity" in the RTI Connext Core Libraries User's Manual) is available on all supported QNX platforms.

7.4.3 Automatic Thread-Specific Storage Cleanup

QNX systems support automatic thread-specific storage cleanup. Use of the DomainParticipantFactory::unregister_thread API is therefore not required to clean up thread-specific storage in user threads (although it is safe to do so).

7.5 Socket Buffer Size Configuration

See Table 7.14 UDP send_socket_buffer_size and Table 7.15 UDP receive_socket_buffer_size. For more information on the send_socket_buffer_size and receive_socket_buffer_size properties, see Setting Builtin Transport Properties with the PropertyQosPolicy, in the RTI Connext Core Libraries User's Manual.

Table 7.14 UDP send_socket_buffer_size

Property

Behavior

NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_DEFAULT

Uses default send socket buffer size net.inet.udp.sendspace

NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_MAX

Uses maximum send socket buffer size kern.ipc.maxsockbuf

NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_DEFAULT

Uses default send socket buffer size net.inet.udp.sendspace

NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_MAX

Uses maximum send socket buffer size kern.ipc.maxsockbuf

Table 7.15 UDP receive_socket_buffer_size

Property

Behavior

NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_DEFAULT

Uses default receive socket buffer size net.inet.udp.recvspace

NDDS_TRANSPORT_UDPV4_SOCKET_BUFFER_SIZE_OS_MAX

Uses maximum send socket buffer size kern.ipc.maxsockbuf

NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_DEFAULT

Uses default receive socket buffer size net.inet.udp.recvspace

NDDS_TRANSPORT_UDPV6_SOCKET_BUFFER_SIZE_OS_MAX

Uses maximum send socket buffer size kern.ipc.maxsockbuf

7.6 Restarting Applications on QNX Systems

Due to a limitation in the POSIX API, the allocation and the initialization of a shared memory mutex need to be done in separate steps.

The first (and only the first) Connext application that runs in the system using the shared-memory transport on a given domain will create a shared-memory mutex, in separate steps as described above, and subsequent Connext applications will attach to—but not create—this mutex, which is necessary to protect access to the shared-memory area across multiple processes.

It is possible under some extreme circumstances that the Connext application that creates the mutex crashes—or terminates ungracefully—having only partially created the mutex. If this occurs, other Connext applications will consider the mutex is still being created and will not be able to continue their execution, reporting a timeout error and indicating the mutex name.

If this situation occurs, you must manually delete the shared-memory mutex and its segment before re-launching any application in the same DDS domain. The files to delete are:

  • /dev/sem/RTIOsapiSharedMemoryMutex-<identifier>
  • /dev/shmem/RTIOsapiSharedMemorySegment-<identifier>