千家信息网

SylixOS移植ICE库总结

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,1 ICE 简介ICE(Internet Communications Engine)是一种面向对象的中间件平台,主要用于网络通讯。它为面向对象的"客户端-服务器"模型的应用提供了一组很好的工具和AP
千家信息网最后更新 2025年12月03日SylixOS移植ICE库总结

1 ICE 简介

ICE(Internet Communications Engine)是一种面向对象的中间件平台,主要用于网络通讯。它为面向对象的"客户端-服务器"模型的应用提供了一组很好的工具和API接口。目前在全世界被应用于很多项目之中。ICE中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火期穿透,通讯屏蔽。因此相比Corba,DCOM,SOAP,J2EE等的中间件技术,自然是集众多优点于一身,而却没有他们的缺点。


2 资源获取

在官网下载第三方中间件资源,ZeroC ICE的官方下载网站为:https://zeroc.com/downloads/ice#source。本文中使用的版本是V3.7,下载后解压文件,文件目录如图 2.1所示。

图2.1 Ice源码解压后的文件

cpp/、csharp/、java/、js/、objective-c/、php/、python/等目录包含了对应语言的Ice库实现代码,config/目录中存放控制编译方式的相关配置文件,slice/中存放了slice相关工具的代码实现。


3 Linux 平台编译

ICE支持多种语言,并且默认情况下会编译所有语言支持。这里只需要移植C++相关代码,需要修改config/Make.rules中的supported-languages属性,删除不需要的语言支持只保留C++支持,如图 3.1所示。

图 3.1 supported-languages属性修改

修改配置文件后直接在根目录make即可进入编译过程。为了方便后期的移植工作,这里使用V=s选项打印编译详细过程并保存到Make.log文件中,命令:# make V=s > Make.log。编译结束后查看Make.log内容确认编译成功。


4 移植工作

本次移植仅移植C++支持部分的ICE主库即libIce.so,因此只需要使用到cpp目录下的代码文件。由于是C++代码,在创建工程时需要选中C++工程选项。ICE主库代码编译需要依赖libbz2,也需要提前准备。


4.1 工程创建

在Real-Evo IDE中创建libIce的动态库工程。创建时选中C++工程选项并打开专家模式,如图 4.1所示。

图 4.1 创建工程选项

删除src目录下的libIce.c文件,导入源码包中的cpp/目录下与主库相关的代码文件。这里需要注意的是很多代码文件是编译过程中使用slice工具创建的,因此需要在linux环境下编译成功后才能导出所有的文件。其中包括目录cpp/include/generated/Ice/、cpp/include/Ice/、cpp/include/IceUtil/、cpp/src/Ice/、cpp/src/IceUtil/。最终的目录结构如图 4.2所示。

图 4.2 Ice代码目录结构


4.2 配置libIce.mk

分析Make.log中编译libIce.so的过程,罗列出所有需要编译的cpp文件,并逐一加入LOCAL_SRCS中,如图 4.3所示。

图 4.3 添加cpp文件

添加相关的头文件搜索目录,其中包括libbz2的工程路径,如图 4.4所示。

图 4.4 头文件搜索路径

添加宏配置,如图 4.5所示。

图 4.5 添加宏配置

添加编译选项,如图 4.6所示。

图 4.6 添加编译选项

添加依赖库,包括对libbz2库的依赖,如图 4.7所示。

图 4.7 添加依赖库

打开C++编译扩展,如图 4.8所示。

图 4.8 打开C++编译扩展


4.3 代码修改

默认编译会出现若干编译错误,需对部分代码进行修改,具体修改内容如下:

修改src/ice-master/cpp/src/Ice/Cond.cpp,使用CLOCK_REALTIME模式或是时间信息,如图 4.9所示。

图 4.9 修改获取时间方式

修改src/ice-master/cpp/include/IceUtil/Config.h,增加DSP大小端配置,如图 4.10所示。

图 4.10 DSP大小端配置

修改src/ice-master/cpp/include/Ice/Service.h,DSP中interrupt符号冲突,更改为interrupt2,如图 4.11所示。

图 4.11 interrupt符号冲突

修改src/ice-master/cpp/include/IceUtil/Config.h,消除DSP中GNUC版本错误,如图 4.12所示。

图 4.12消除GNUC版本错误

修改src/ice-master/cpp/src/Ice/DynamicLibrary.cpp,DSP中删除动态库相关操作,如图 4.13所示。

图 4.13 DSP中删除动态库相关操作

修改src/ice-master/cpp/src/Ice/Instance.cpp,增加头文件grp.h,如图 4.14所示。

图 4.14增加头文件grp.h

修改src/ice-master/cpp/src/Ice/MetricsAdminI.cpp,DSP中增加部分缺失接口,如图 4.15图 4.16图 4.17所示。

图 4.15 DSP中增加部分缺失接口

图 4.16 DSP中增加部分缺失接口

图 4.17 DSP中增加部分缺失接口

src/ice-master/cpp/src/Ice/Network.cpp,DSP中增加缺失的部分接口,如图 4.18图 4.19图 4.20图 4.21图 4.22所示。

图 4.18 DSP中增加缺失的部分接口

图4.19 DSP中增加缺失的部分接口

图 4.20 DSP中增加缺失的部分接口

图 4.21 DSP中增加缺失的部分接口

图 4.22 DSP中增加缺失的部分接口

src/ice-master/cpp/src/Ice/Service.cpp,删除fork调用相关代码,如图 4.23所示。

图 4.23删除fork调用相关代码

src/ice-master/cpp/src/Ice/Thread.cpp,纠正pthread_join返回值差异,如图 4.24所示。

图 4.24纠正pthread_join返回值差异

src/ice-master/cpp/src/IceUtil/RecMutex.cpp,纠正pthread_mutex_trylock返回值差异,如图 4.25所示。

图 4.25纠正pthread_mutex_trylock返回值差异

src/ice-master/cpp/src/IceUtil/UtilException.cpp,DSP中使用strdup代替接口__cxa_demangle,如图 4.26所示。

图 4.26 DSP中使用strdup代替接口__cxa_demangle


5 ICE 基本使用

ICE应用架构是服务器客户端模式,包括服务端和客户端两部分代码。客户端和服务器代码由slice工具所生成的接口代码联系到一起。下面使用ICE运行一个简单的helloworld测试例程。

5.1 生成接口代码

编写接口代码demo.ice,如程序清单 5.1所示。

程序清单 5.1 demo.ice

module demo{    interface printer    {        void printerstr(string msg);    };};

在linux中使用ICE源码中编译生成的slice工具生成接口代码:

# cpp/bin/slice2cpp demo.ice

可在当前目录中生成接口代码demo.cpp、demo.h。


5.2 创建测试工程

在RealEvo-IDE中创建应用工程,导入代码demo.cpp、demo.h,并创建代码文件server.cpp、client.cpp,内容如程序清单 5.2所示。

程序清单 5.2 server.cpp和client.cpp

client.cpp#include #include using namespace demo;using namespace std;intmain(int argc, char * argv[]){    int status = 0;    Ice::CommunicatorPtr ic;    try {        ic = Ice::initialize(argc, argv);        Ice::ObjectPrx base = ic->stringToProxy(                "SimplePrinter:default -p 10000");        printerPrx printer = printerPrx::checkedCast(base);        if (!printer)            throw "Invalid proxy";        printer->printerstr("Hello World!");    } catch (const Ice::Exception & ex) {        cerr << ex << endl;        status = 1;    } catch (const char * msg) {        cerr << msg << endl;        status = 1;    }    if (ic)        ic->destroy();    return status;}server.cpp#include #include using namespace demo;using namespace std;class PrinterI : public printer {    public:        virtual void printerstr(const string & s,                const Ice::Current &);};voidPrinterI::printerstr(const string & s, const Ice::Current &){    cout << s << endl;}intmain(int argc, char* argv[]){    int status = 0;    Ice::CommunicatorPtr ic;    try {        ic = Ice::initialize(argc, argv);        Ice::ObjectAdapterPtr adapter            = ic->createObjectAdapterWithEndpoints(                    "SimplePrinterAdapter", "default -p 10000");        Ice::ObjectPtr object = new PrinterI;        adapter->add(object,                ic->stringToIdentity("SimplePrinter"));        adapter->activate();        ic->waitForShutdown();    } catch (const Ice::Exception & e) {        cerr << e << endl;        status = 1;    } catch (const char * msg) {        cerr << msg << endl;        status = 1;    }    if (ic)        ic->destroy();    return status;}

应用程序同样使用专家模式,需创建server.mk和client.mk两份Makefile文件。分别加入对应的代码,server.mk中编译demo.cpp、server.cpp,client.mk中编译demo.cpp、client.cpp。并依赖ICE库。编译生成两份可执行文件,server和client。在SylixOS设备上先后执行server和client,若在执行client时server出现"Hello World"信息表示client成功调用server接口,运行结果正常。


代码 如图 编译 文件 接口 部分 目录 缺失 工程 C++ 配置 移植 工具 程序 语言 应用 支持 服务 生成 中间件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法约谈制度 计算机网络技术要买笔记本吗 狂野飙车无法在服务器上执行操作 服务器机柜深度 亿格瑞连接群晖无法登录服务器 小米擅自访问新加坡服务器 大学有游戏软件开发专业吗 西安软件开发公司10强股吧 河北软件开发者网站 自考数据库技术实践 三维地质建模软件开发商合作 铁路网络安全红线问题包括哪些 义乌市舍予网络技术服务部 有哪些最好的云服务器 互联网科技都有什么区别 计算机网络安全方面的面试题 公司查询网络安全通知 数据库数组 逃离塔科夫国内加载什么服务器 本地专业软件开发哪家便宜 为什么服务器都在境外 网络安全工程师一般干到几岁 国家网络安全法制宣传主题 铁路网络安全红线问题包括哪些 软件开发管理的控制框架 数据库结构模型有哪几种 威海联亚软件开发有限公司怎么样 华为cc08bam服务器组网 雅安谝妇网络技术有限公司 吴云坤谈网络安全
0