MPRPC项目制作(第四天)

先花了很长的的时间解决了build(具体描述找不到了)和mprpcapplication.cc找不到头文件的问题,可以这样解决

build下的问题这样重新配置了

  1. Ctrl+Shift+P 打开命令面板;

  2. 输入并执行 CMake: Delete Cache and Reconfigure(插件会自动删除旧缓存 + 重新配置)

有的时候可以等vscode缓冲过来或者清除一下缓存。

有的时候也可以进入build目录,手动cmake:

先rm -r *,然后cmake..,再make一下

一、框架项目动态库编译

目录在最后

当前example下的CMakelists

cpp 复制代码
add_subdirectory(callee)

src下

cpp 复制代码
aux_source_directory(. SRC_LIST)    # 收集当前目录下所有源文件到变量SRC_LIST中
add_library(mprpc SHARED ${SRC_LIST})   # 使用SRC_LIST中的源文件创建名为mprpc的共享库

根目录下

cpp 复制代码
# 设置cmake的最低版本和项目名称
cmake_minimum_required(VERSION 3.0)
project(mprpc)

# 设置项目可执行文件输出的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 设置项目库文件输出的路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

# 设置项目编译头文件搜索路径 -I
include_directories(${PROJECT_SOURCE_DIR}/src/include)
include_directories(${PROJECT_SOURCE_DIR}/example)
# 设置项目库文件搜索路径 -L
link_directories(${PROJECT_SOURCE_DIR}/lib)

# src包含了mprpc框架所有的相关代码
add_subdirectory(src)
# example包含了mprpc框架使用的示例代码
add_subdirectory(example)

二、Init函数实现

cpp 复制代码
void MprpcApplication::Init(int argc,char **argv){
    if(argc<2){
        ShowArgHelp();
        exit(EXIT_FAILURE);
    }

    int c = 0;
    std::string config_file;
    while((c = getopt(argc,argv,"i:"))!=-1){
        switch(c){
            case 'i':
                config_file = optarg;
                break;
            case '?':
                std::cout<<"invalid args!"<<std::endl;
                ShowArgHelp();
                exit(EXIT_FAILURE);
            //出现-i,但没有带正确的参数
            case ':':
                std::cout<<"need <configfile>"<<std::endl;
                ShowArgHelp();
                exit(EXIT_FAILURE);
            default:
                break;
        }
    }
    //开始加载配置文件rpcserverip  rpcserverport  zookeeperip  zookeeperport
    m_config.LoadConfigFile(config_file.c_str());

    std::cout<<"rpcserverip:"<<m_config.Load("rpcserverip")<<std::endl;
    std::cout<<"rpcserverport:"<<m_config.Load("rpcserverport")<<std::endl;
    std::cout<<"zookeeperip:"<<m_config.Load("zookeeperip")<<std::endl;
    std::cout<<"zookeeperprot:"<<m_config.Load("zookeeperport")<<std::endl;
}
  1. argc 计算所有参数,包括程序名
  2. getopt 的第三个参数 "i:" 中的冒号表示 -i 需要一个参数
  3. optarg 会自动指向 -i 后面的参数值

所以:progtam -i config.txt

  • argc = 3
  • argv[0] = "program"
  • argv[1] = "-i"
  • argv[2] = "config.txt"
  • config_file 最终会得到 "config.txt" 的值

然后进入LoadConfigFile函数来加载配置文件

Trim函数为去掉配置文件前后空格。

该初始化也去掉了配置文件的换行符。

cpp 复制代码
#include "mprpcconfig.h"

#include<iostream>
#include<fstream>
#include<string>


//负责解析加载配置文件
void MprpcConfig::LoadConfigFile(const char *config_file){
    FILE *pf = fopen(config_file, "r");
    if(pf == nullptr){
        std::cout<<pf<<" is not exist"<<std::endl;
        exit(EXIT_FAILURE);
    }

    //1.去掉注释    2.得到正确的配置项  3.去掉开头多余的空格
    while(!feof(pf)){
        char buf[512] = {0};
        fgets(buf,512,pf);

        std::string src_buf(buf);
        //去掉字符串多余空格
        Trim(src_buf);
        
        //去掉注释
        if(src_buf.empty() || src_buf[0] == '#' ){
            continue;
        }

        int idx = 0;
        //得到正确的配置项
        idx = src_buf.find("=");
        if(idx == -1){
            continue;
        }
        std::string key;
        std::string value;
        key = src_buf.substr(0,idx);
        Trim(key);
        int endidx = src_buf.find('\n',idx);
        value = src_buf.substr(idx+1,endidx - idx-1);
        Trim(value);
        m_configMap.insert({key,value});
    }
    fclose(pf);
}

//查询配置项信息
std::string MprpcConfig::Load(const std::string &key){
    auto it = m_configMap.find(key);
    if(it == m_configMap.end()){
        return "";
    }
    return it->second;
}

//去掉字符串前后的空格
void MprpcConfig::Trim(std::string &src_buf){
         //去掉字符串前面多余的空格
        int idx = src_buf.find_first_not_of(" ");
        if(idx != -1){
            src_buf = src_buf.substr(idx,src_buf.size() - idx);
        }

        //去掉字符串后面多余空格
        idx = src_buf.find_last_not_of(" ");
        if(idx != -1){
            src_buf = src_buf.substr(0,idx+1);
        }
}

输出结果

cpp 复制代码
wky@wky-virtual-machine:~/MPRPC/bin$ ./provider -i ./test.conf
rpcserverip:127.0.0.1
rpcserverport:8080
zookeeperip:127.0.0.1
zookeeperprot:5000

三、当前目录

相关推荐
J***79391 小时前
前端在移动端中的React Native Windows
前端·react native·react.js
阿雄不会写代码1 小时前
PPTX报错AttributeError: module ‘collections‘ has no attribute ‘Container‘
前端
前端程序猿i1 小时前
前端判断数据类型的所有方式详解
开发语言·前端·javascript
一点 内容1 小时前
AI搜索前端打字机效果实现方案演进:从基础到智能化的技术跃迁
前端·人工智能
GISer_Jing1 小时前
SEEConf大会分享——AI FOR FRONTEDN
前端·人工智能
我也爱吃馄饨1 小时前
前端视角下的浏览器LNA问题
前端·javascript·chrome
TechMasterPlus1 小时前
SpringBoot-RestController
java·spring boot·后端
m***66731 小时前
Java实战:Spring Boot application.yml配置文件详解
java·网络·spring boot
棱角°1 小时前
finally与return对于返回值的影响
java·finally·return