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

三、当前目录

相关推荐
酸菜土狗几秒前
🔥 手写 Vue 自定义指令:实现内容区拖拽调整大小(超实用)
前端
小萌新上大分几秒前
synchronized的8锁问题(区分默认用的是那把锁) 笔记云备份
java·java多线程·synchronized·synchronized关键字·synchronized用法·多线程买票问题·java锁机制
ohyeah3 分钟前
深入理解 React Hooks:useState 与 useEffect 的核心原理与最佳实践
前端·react.js
Cache技术分享5 分钟前
275. Java Stream API - flatMap 操作:展开一对多的关系,拉平你的流!
前端·后端
sino爱学习18 分钟前
别再踩 Stream 的坑了!Java 函数式编程安全指南
java·后端
Sunsets_Red28 分钟前
2025 FZYZ夏令营游记
java·c语言·c++·python·算法·c#
apollo_qwe28 分钟前
前端缓存深度解析:从基础到进阶的实现方式与实践指南
前端
周星星日记36 分钟前
vue中hash模式和history模式的区别
前端·面试
Light6036 分钟前
Vue 高阶优化术:v-bind 与 v-on 的实战妙用与思维跃迁
前端·低代码·vue3·v-bind·组件封装·v-on·ai辅助开发
周星星日记37 分钟前
5.为什么vue中使用query可以保留参数
前端·vue.js