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

三、当前目录

相关推荐
风度前端16 小时前
用了都说好的 uniapp 路由框架
前端
冴羽16 小时前
2026 年 Web 前端开发的 8 个趋势!
前端·javascript·vue.js
码银16 小时前
ruoyi的前端(vue)新增的时候给字典设置默认值 但不能正常
前端
SuperherRo16 小时前
JAVA攻防-Shiro专题&断点调试&有key利用链&URL&CC&CB&原生反序列化&加密逻辑
java·shiro·反序列化·有key·利用链·原生反序列化·加密逻辑
05大叔16 小时前
大事件Day02
运维·服务器
桦说编程16 小时前
简单方法实现子任务耗时统计
java·后端·监控
爱笑的眼睛1116 小时前
超越可视化:降维算法组件的深度解析与工程实践
java·人工智能·python·ai
五仁火烧16 小时前
Vue3 项目的默认端口行为
服务器·vue.js·nginx·容器·vue
盖世英雄酱5813617 小时前
物品超领取损失1万事故复盘(一)
java·后端