c++ RMI demo(使用RCF库)

本文档详细介绍了如何在Ubuntu系统中下载、编译RCF库并生成静态库和动态库。通过示例展示了如何使用这些库编写RMI(远程方法调用)程序,包括客户端和服务端的实现。同时,文中提到了编译过程中解决uuid头文件缺失的问题,并提供了使用静态库和动态库的编译命令。
摘要由CSDN通过智能技术生成

作业要求
在这里插入图片描述
下载RCF库并编译成静态库/动态库
宿主机操作系统:ubuntu

wget https://www.deltavsoft.com/downloads/RCF-3.2.413.tar.gz # 下载RCF压缩包
tar xvf RCF-3.2.413.tar.gz # 解压到本地文件夹

在/root/code/rcf/RCF-3.2.413文件夹下

g++ -I include/  src/RCF/RCF.cpp -lpthread -ldl -luuid -c # 生成obj文件
# -l:链接第三方库 -I:头文件目录  -c只进行 预处理, 编译,汇编操作,生成.o (.obj)文件,不进行链接。

报错fatal error: uuid/uuid.h: No such file or directory
sudo apt-get install uuid-dev # 安装uuid-devuuid-dev
# 重新运行g++命令成功
mkdir lib # 创建lib文件夹,存放静态库与动态库文件

# 生成静态库
# 将所有.o文件打包为静态库,r将文件插入静态库中,c创建静态库,不管库是否存在,s写入一个目标文件索引到库中
ar rcs librcf.a  RCF.o 
mv librcf.a  lib/
mv RCF.o  lib/RCF_static.o


# 生成动态库
g++ -I include/  src/RCF/RCF.cpp -lpthread -ldl -luuid -c -fPIC 	# 参数-fPIC表示生成与位置无关代码
g++ -shared -o librcf.so RCF.o
mv librcf.so  lib/
mv RCF.o  lib/RCF_share.o

在这里插入图片描述

仿照/root/code/rcf/RCF-3.2.413/demo文件夹下的demo编写RMI程序

// interface.h
#pragma once
#include <string>
#include <RCF/RCF.hpp>

RCF_BEGIN(I_Translate, "I_Translate")
RCF_METHOD_R1(std::string, Translate, const std::string &);
RCF_END(I_Translate);

// server.cpp
#include <iostream>
#include <string>
#include <map>

#include "interface.h"

class Translator
{
  public:
    std::string Translate(const std::string &str)
    {
        if(word_list_.count(str)!=0){
            return  word_list_[str];
        }
        return {};
    }
    void InsertSampleData()
    {
        word_list_.insert({"Afghanistan", "阿富汗"});
        word_list_.insert({"Denmark", "丹麦"});
        word_list_.insert({"Egypt", "埃及"});
        word_list_.insert({"Finland", "芬兰"});
        word_list_.insert({"Korea (South)", "韩国"});
        word_list_.insert({"Kuwait", "科威特"});
    }

  private:
    std::map<std::string, std::string> word_list_;
};

int main()
{
    RCF::RcfInit rcfInit;

    std::string networkInterface = "0.0.0.0";
    int port = 50001;
    std::cout << "Starting server on " << networkInterface << ":" << port << "." << std::endl;

    // Start a TCP server, and expose DemoService.
    Translator translator;
    translator.InsertSampleData();
    RCF::RcfServer server(RCF::TcpEndpoint(networkInterface, port));
    server.bind<I_Translate>(translator);
    server.start();

    std::cout << "Press Enter to exit..." << std::endl;
    std::cin.get();

    return 0;
}

// client.cpp
#include <iostream>
#include <string>

#include "interface.h"

int main()
{
    RCF::RcfInit rcfInit;

    try
    {

        std::string networkInterface = "127.0.0.1";
        int port = 50001;
        std::cout << "Connecting to server on " << networkInterface << ":" << port << "." << std::endl;

        // Make the call.
        auto remotes_obj = RcfClient<I_Translate>(RCF::TcpEndpoint(networkInterface, port));
        std::string input_string;
        std::string translate_res;
        while (true)
        {
            std::cout << "输入需要查询的英文单词,按q结束查询" << std::endl;
            std::cin >> input_string;
            if (input_string == "q")
            {
                break;
            }
            translate_res = remotes_obj.Translate(input_string).get();
            if (translate_res == "")
            {
                std::cout << "词汇表中未存该单词" << std::endl;
            }
            else
            {
                std::cout << translate_res << std::endl;
            }
        }
    }
    catch (const RCF::Exception &e)
    {
        std::cout << "Caught exception:\n";
        std::cout << e.getErrorMessage() << std::endl;
        return 1;
    }

    return 0;
}

编译运行

# 使用静态库
g++ client.cpp   /root/code/rcf/RCF-3.2.413/lib/librcf.a  -I /root/code/rcf/RCF-3.2.413/include/ -o client_static -lpthread -ldl -luuid
g++ server.cpp   /root/code/rcf/RCF-3.2.413/lib/librcf.a  -I /root/code/rcf/RCF-3.2.413/include/ -o server_static -lpthread -ldl -luuid


# 使用动态库
g++ client.cpp   /root/code/rcf/RCF-3.2.413/lib/librcf.so  -I /root/code/rcf/RCF-3.2.413/include/ -o client_share -lpthread -ldl -luuid
g++ server.cpp   /root/code/rcf/RCF-3.2.413/lib/librcf.so  -I /root/code/rcf/RCF-3.2.413/include/ -o server_share -lpthread -ldl -luuid

在这里插入图片描述
在这里插入图片描述
突然想到以上能成功的原因是不是因为interface.h中只使用了RCF.hpp,实际上是不是应该将所有源文件编译成obj文件,而后打包成静态库/动态库呢?以后再用到这个库时再看,不过打包成库的步骤差不多,也没有太大问题
参考博客
RCF的使用
Linux基础——gcc编译、静态库与动态库(共享库)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最佳损友1020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值