Ice-E 3.6.0 Release Notes

Ice-E brings Ice to embedded devices, in particular Linux/ARM devices. Ice-E adds cross-compilation capabilities to Ice: with Ice plus Ice-E, you can develop C++ applications for Linux/ARM systems on your Linux x86_64 workstation.

On this page:

Comparing Ice-E and Ice

Ice-E and Ice provide the same API and implement the same Ice protocol. Here is a brief comparison of these two products:

C++, Python(tick)(tick)
Java, JavaScript, Objective-C, PHP, Ruby(error)(tick)
Ice transports: tcp, ssl, ws, wss, udp(tick)(tick)
Client libraries for Ice services (IceGrid, IceStorm etc.)(tick)(tick)
Glacier2 firewall traversal service(tick)(tick)
Other Ice services (IceGrid, IceStorm, Freeze, IcePatch2)(error)(tick)
Supports cross-compilation to Linux/ARM(tick)(error)
Static libraries(tick)(error)
Dynamic libraries(error)(tick)


New features in Ice-E 3.6.0

This section outlines changes and improvements in this release that may affect the operation of your applications or have an impact on your source code.


  • Ice-E is now fully in-sync with Ice:
    • Ice-E uses the same developer kit as Ice: the Slice files, C++ header files, and Slice compiler (slice2cpp) are shared by Ice and Ice-E. 
    • The Ice-E and Ice versions are now the same.
    • The preferred method to install Ice-E on Ubuntu is now through apt repositories.
  • IceDiscovery, IceLocatorDiscovery, IceSSL, IceStringConverter and IceUtil are all included in the Ice static library.

Support for Ice 3.6.0 features

Ice-E 3.6.0 is based on the Ice 3.6.0 release. For more information see the Ice 3.6.0 Release Notes.

Using Plug-ins with Static Libraries

Ice-E provides only static libraries, which presents a challenge for loading plug-ins: since there is no shared library loading at run time, the plug-ins must be linked with your application. 

Despite this difficulty, Ice-E offers plug-ins just like Ice, and provides the same built-in plug-ins: IceDiscovery, IceLocatorDiscoveryIceSSL, and IceStringConverter.

You link these plug-ins with your application by calling the Ice::registerPluginFactory function in your code, for example:

// Declare the plug-in factory function for IceSSL
extern "C"
Ice::Plugin* createIceSSL(const Ice::CommunicatorPtr&, const string&, const Ice::StringSeq&);
main(int argc, char* argv[])
    // Register this plug-in factory function before communicator initialization
    Ice::registerPluginFactory("IceSSL", createIceSSL, false);

Refer to the Plug-in API for more information on Ice::registerPluginFactory.

You can configure the plug-in using properties as usual.

The IceDiscovery, IceLocatorDiscoveryIceSSL, and IceStringConverter plug-ins are included in the libIce.a static library.  Ice 3.6.0 header files do not provide declarations for the corresponding plug-in factory functions, and as a result you need to provide your own declarations for these functions to register them. The names of these factory functions are always create<PluginName>, for example createIceSSL, createIceDiscovery.

This mechanism isn't limited to the built-in Ice plug-ins – it can also be used to load your own plug-ins.

Upgrading your application from a previous version of Ice-E

Ice-E 3.6 is not compatible with previous versions of Ice-E. As part of your upgrade to Ice-E 3.6, you need to update your source code and recompile all your Slice files.