成都网站建设设计

将想法与焦点和您一起共享

SylixOS移植ICE库总结-创新互联

1 ICE 简介

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

成都创新互联主营白碱滩网站建设的网络公司,主营网站建设方案,成都App制作,白碱滩h5重庆小程序开发搭建,白碱滩网站营销推广欢迎白碱滩等地区企业咨询

 
2 资源获取

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

SylixOS移植ICE库总结

                                                       图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所示。

SylixOS移植ICE库总结

                                                             图 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所示。

SylixOS移植ICE库总结

                                   图 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所示。

SylixOS移植ICE库总结

                     图 4.2 Ice代码目录结构

 
4.2 配置libIce.mk

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

SylixOS移植ICE库总结

                               图 4.3 添加cpp文件

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

SylixOS移植ICE库总结

                       图 4.4 头文件搜索路径

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

SylixOS移植ICE库总结

                            图 4.5 添加宏配置

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

SylixOS移植ICE库总结

                            图 4.6 添加编译选项

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

SylixOS移植ICE库总结

                            图 4.7 添加依赖库

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

SylixOS移植ICE库总结

                            图 4.8 打开C++编译扩展

 
4.3 代码修改

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

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

SylixOS移植ICE库总结

                          图 4.9 修改获取时间方式

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

SylixOS移植ICE库总结

                          图 4.10 DSP大小端配置

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

SylixOS移植ICE库总结

                         图 4.11 interrupt符号冲突

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

SylixOS移植ICE库总结

                       图 4.12消除GNUC版本错误

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

SylixOS移植ICE库总结

SylixOS移植ICE库总结

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

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

SylixOS移植ICE库总结

                        图 4.14增加头文件grp.h

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

SylixOS移植ICE库总结

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

SylixOS移植ICE库总结

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

SylixOS移植ICE库总结

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

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

SylixOS移植ICE库总结

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

SylixOS移植ICE库总结

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

SylixOS移植ICE库总结

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

SylixOS移植ICE库总结

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

SylixOS移植ICE库总结

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

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

SylixOS移植ICE库总结

                  图 4.23删除fork调用相关代码

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

SylixOS移植ICE库总结

                 图 4.24纠正pthread_join返回值差异

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

SylixOS移植ICE库总结

                 图 4.25纠正pthread_mutex_trylock返回值差异

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

SylixOS移植ICE库总结

                  图 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接口,运行结果正常。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:SylixOS移植ICE库总结-创新互联
链接地址:http://chengdu.cdxwcx.cn/article/copjdo.html