先花了很长的的时间解决了build(具体描述找不到了)和mprpcapplication.cc找不到头文件的问题,可以这样解决
build下的问题这样重新配置了
-
按
Ctrl+Shift+P打开命令面板; -
输入并执行
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;
}
argc计算所有参数,包括程序名getopt的第三个参数"i:"中的冒号表示-i需要一个参数optarg会自动指向-i后面的参数值
所以:progtam -i config.txt
argc = 3argv[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
三、当前目录
