(自用)共享单车服务器(一):服务器项目配置

项目目录结构

conf:用来存放配置文件

git:用来存放从git上克隆的项目

src:用来存放项目源文件

test:用来存放测试文件

third:用来存放第三方头文件、第三方库

安装iniparser(关于iniparser的使用需进一步学习)

1.项目目录中创建git文件夹,用于存放GitHub上克隆来的工具

2.进入git文件夹执行

git clone https://github.com/ndevilla/iniparser

3.执行

cmake .

生成makefile

4.执行make

make

5.在项目主目录下创建thrid文件夹,用来存放第三方内容

third目录结构如下:

其中include用来存放头文件

lib用来存放库文件

在thrid/lib文件夹中创建iniparser文件夹,用来存放iniparser对应的库文件

在thrid/include文件夹中创建iniparser文件夹,用来存放iniparser对应的头文件

6.将库文件(libiniparser.a、libiniparser.so.4、libiniparser.so.4.2.4)放入 third/lib/iniparser 文件夹

7将iniparser/src目录下的头文件(dictionary.h、iniparser.h)放入 third/include/iniparser中

8.在主项目目录下创建conf文件夹,用来存放配置文件夹

创建配置文件shared_bike.ini,并填入基本信息

[database]
ip       = 127.0.0.1 ;
port     = 3306 ;
user     = root ;
pwd      = 123456 ;
db       = qiniubike;[server]
port     = 9090;

ini解析实现

主要是利用iniparser读取ini配置文件中的参数。

1.首先在conf文件夹下创建配置文件shared_bike.ini

内容如下:

shared_bike.ini

[database]
ip       = 127.0.0.1 ;
port     = 3306 ;
user     = root ;
pwd      = 123456 ;
db       = qiniubike;[server]
port     = 9090;

进行一些基本的配置,其他参数等后面添加。

2.在项目源文件目录src下创建common文件夹,common文件夹用于存放用的比较普遍的.h文件和.cpp文件

解析ini的相关.h和.cpp文件放在common文件夹下

configdef:定义存放ini文件参数的结构体

iniconfig:对于iniparser的一些解析配置文件的函数进行封装

configdef.h代码如下:

#ifndef SHBK_COMMON_CONFIGDEF_H_
#define SHBK_COMMON_CONFIGDEF_H_
typedef struct st_env_config
{//数据库的配置std::string db_ip;//数据库ipunsigned short db_port;//数据库端口std::string db_user;//数据库登录用户std::string db_pwd;//数据库登录密码std::string db_name;//数据库名字//服务器的配置unsigned short svr_port;//服务器端口号st_env_config(){}st_env_config(std::string db_ip,unsigned short db_port,std::string db_user,std::string db_pwd,std::string db_name,unsigned short svr_port){this->db_ip = db_ip;this->db_port = db_port;this->db_user = db_user;this->db_pwd =db_pwd;this->db_name = db_name;this->svr_port = svr_port;}st_env_config& operator = (st_env_config& o){if(this!=&o)//自己赋值给自己就是浪费时间{this->db_ip = o.db_ip;this->db_port = o.db_port;this->db_user = o.db_user;this->db_pwd = o.db_pwd;this->db_name = o.db_name;this->svr_port = o.svr_port;}return *this;}}_st_env_config;#endif // !1

configdef.h定义了一个结构体用来存放从配置文件中读取的数据。

iniconfig.cpp:

#include"iniconfig.h"
#include<iniparser/iniparser.h>Iniconfig::Iniconfig():_isloaded(false)
{}Iniconfig::~Iniconfig()
{}bool Iniconfig::loadfile(const std::string& path)
{dictionary* ini = NULL;//建立字典用来保存读到的所有配置项ini = iniparser_load(path.c_str());if (ini == NULL) {fprintf(stderr, "cannot parse file: %s\n", path.c_str());return -1;}iniparser_dump(ini, stderr);const char* db_ip = iniparser_getstring(ini, "database:ip", "127.0.0.1");const int db_port = iniparser_getint(ini,"database:port",3306);const char* db_user = iniparser_getstring(ini,"database:user","root");const char* db_pwd = iniparser_getstring(ini,"database:pwd","123456");const char* db_name = iniparser_getstring(ini,"database:db","qiniubike");const int serv_port = iniparser_getint(ini,"database:port",9090);_config = st_env_config(std::string(db_ip),db_port,std::string(db_user),std::string(db_pwd),std::string(db_name),serv_port);//调用赋值运算符重载iniparser_freedict(ini);_isloaded = true;return true;
}const st_env_config& Iniconfig::getconfig()
{return _config;
}

loadfile函数将读取ini文件中的参数

3.在src文件夹下创建main.cpp,解析配置参数:

#include"iniconfig.h"
#include"configdef.h"int main(int argc,char** argv)
{if (argc != 2){printf("Please input shbk<config file path>!\n");return -1;}Iniconfig config;if (!config.loadfile(std::string(argv[1]))){printf("load %s failed.\n",argv[1]);return -2;}st_env_config conf_args = config.getconfig();printf("[database] ip:%s port:%d user:%s pwd:%s db_name:%s [server] port:%d \n",conf_args.db_ip,conf_args.db_port,conf_args.db_user,conf_args.db_pwd,conf_args.db_name,conf_args.svr_port);return 0;
}

工程级CMake实现(关于CMakeLists.txt的编写需要进一步学习)

在src/common目录下编写CMakeLists.txt文件

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)#搜集所有在指定路径下的源文件的文件名,将输出结果列表存储在指定的变量中
aux_source_directory(. SOURCE_COMMON_FILES)#add_library
#构建库供其他模块使用
ADD_LIBRARY(common ${SOURCE_COMMON_FILES})#用来显示的定义变量
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations")#将指定目录添加到编译器的头文件搜索路径之下
LINK_DIRECTORIES(../../third/lib/iniparser)#该指令的作用为将目标文件与库文件进行链接
TARGET_LINK_LIBRARIES(common iniparser)
TARGET_LINK_LIBRARIES(common dl)

在src目录下编写CMakeLists,txt文件

#cmake版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)#项目名称
PROJECT(shared_bike)#将指定目录添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(../third/include)
INCLUDE_DIRECTORIES(./common)LINK_DIRECTORIES(../third/lib/iniparser)
LINK_DIRECTORIES(./common)#搜集所有在指定路径下的源文件的文件名,将输出结果列表存储在指定的变量中
#内置变量:CMAKE_SOURCE_DIR定义了顶级CMakeLists.txt所在的文件夹,PROJECT_SOURCE_DIR定义了包含最近的project()命令的CMakeLists.txt所在的文件夹
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)#使用给定的源文件,,为工程引入一个可执行文件
ADD_EXECUTABLE(shared_bike ${SOURCE_FILES})SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -g3 -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations -fpermissive")TARGET_LINK_LIBRARIES(shared_bike iniparser)
TARGET_LINK_LIBRARIES(shared_bike common)#增加子目录
ADD_SUBDIRECTORY(common)SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
INSTALL(TARGETS shared_bike DESTINATION bin)

在src目录下执行

cmake .
make

生成可执行文件shared_bike

运行shared_bike

 

如上图所示,输出了配置信息 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络-IGMPv1工作原理简介

一、IGMPv1的原理简介 前面我们大致了解了IGMP用于在连接组播组成员的组播路由器总通过交互IGMP报文生成IGMP组表项和IGMP路由表项。IGMP报文封装在IP报文中。到目前为止&#xff0c;IGMP有三个版本&#xff1a;IGMPv1、IGMPv2、IGMPv3。 今天主要学习IGMPv1的作用和工作原理。…

深度学习论文: LLaMA: Open and Efficient Foundation Language Models

深度学习论文: LLaMA: Open and Efficient Foundation Language Models LLaMA: Open and Efficient Foundation Language Models PDF:https://arxiv.org/pdf/2302.13971.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 本文介绍了LLaMA&#xff0…

数据开源 | Magic Data大模型高质量十万轮对话数据集

能够自然的与人类进行聊天交谈&#xff0c;是现今的大语言模型 (LLM) 区别于传统语言模型的重要能力之一&#xff0c;近日OpenAI推出的GPT-4o给我们展示了这样的可能性。 对话于人类来说是与生俱来的&#xff0c;但构建具备对话能力的大模型是一项不小的挑战&#xff0c;收集高…

基于Android平台开发,仿头条新闻app

1. 项目模块功能思维导图 2. 项目涉及到的技术点 数据来源&#xff1a;聚合数据API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现新闻列表使用SQLite数据库实现用户登录&#xff0c;注册&#xff0c;浏览历史记录使用SharedPreference…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验17 开放最短路径优先OSPF

一、实验目的 1.验证OSPF协议的作用&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证OSPF协议的作用。 四、实验步骤 1.构建网…

AutoMQ 与蚂蚁数科达成战略合作

近期&#xff0c;AutoMQ 与蚂蚁数科正式签署战略合作协议&#xff0c;将和蚂蚁数科云原生 PaaS 平台 SOFAStack 在产品研发、生态集成、市场合作、技术社区影响力等多方面开展深度合作。 AutoMQ 是业内领先的消息和流存储服务提供商&#xff0c;基于云原生基础设施重新设计了 …

解密 AI 客服:LangChain+ChatGPT 打造智能客服新时代

你需要了解 ChatGPT ChatGPT 是 OpenAI 开发的一种基于人工智能技术的自然语言处理模型。它可以通过对大量文本数据进行训练&#xff0c;自动生成高质量的回答和对话。ChatGPT 具有高效、准确、自然的特点&#xff0c;可以帮助人们更加高效地处理信息和交流。 ChatGPT 有很多…

el-from中校验,如果某一项需要另一项填写才能校验

使用validateField <el-form:model"params":rules"rules":scroll-to-error"true"ref"refrom"v-else><el-form-item label"用户姓名" prop"name"><el-input placeholder"请输入用户姓名"…

图片海报怎么做成二维码展示?二维码分享图片的制作技巧

怎么把图片的宣传海报做成二维码呢&#xff1f;在做活动或者产品宣传时&#xff0c;都会制作精美的图片海报&#xff0c;除了打印传单或者制作展板的方式来展示外&#xff0c;将海报图片生成二维码&#xff0c;通过分享二维码来实现图片海报的快速传播&#xff0c;能够有效提升…

大话光学原理:2.最短时间原理、“魔法石”与彩虹

一、最短时间原理 1662年左右&#xff0c;费马在一张信纸的边角&#xff0c;用他那著名的潦草笔迹&#xff0c;随意地写下了一行字&#xff1a;“光在两点间选择的路&#xff0c;总是耗时最少的。”这句话&#xff0c;简单而深邃&#xff0c;像是一颗悄然种下的种子&#xff0c…

After Detailer让图像自动修复

After Detailer&#xff08;简称adetailer&#xff09;是一个Stable Diffusion的自动Web-UI扩展&#xff0c;它能够自动化修复图像中的不完整部分&#xff0c;例如模糊的人脸等常见问题。在这篇文章中&#xff0c;你将了解它的工作原理、如何使用它&#xff0c;以及一些常见的使…

品牌策划学习资源全攻略:从入门到精通的推荐清单!

这里再分享一些网站书籍和杂志给大家。 TOPYS创意内容平台&#xff1a; 专注于创意内容分享&#xff0c;涵盖广告、设计、艺术等多个领域&#xff0c;是广告设计人寻找创意灵感的好去处。 Dribbble&#xff1a; 设计师社区&#xff0c;用户可以浏览到全球设计师的优秀作品&…

使用webrtc-streamer查看rtsp实时视频

1.下载webrtc-streamer 2.解压运行webrtc-streamer.exe 在浏览器访问127.0.0.1:8000&#xff0c;点击窗口可以看到本机上各窗口实时状态&#xff0c;点击摄像头可以显示摄像头画面。 5.安装phpstudy&#xff0c;并建立网站。&#xff08;具体过程自己网上搜&#xff09; 6.打开…

【探索Linux】P.38(传输层 —— TCP协议通信连接管理机制简介 | TCP连接状态转换)

阅读导航 引言一、TCP协议通信连接管理机制二、连接状态转换1. TCP状态转换图2. 状态转换过程3. 理解TIME_WAIT状态&#xff08;1&#xff09;目的和作用&#xff08;2&#xff09;状态转换&#xff08;3&#xff09;特殊情况&#xff08;4&#xff09;影响和优化 4. 理解 CLOS…

多模态大模型时代下的文档图像智能分析与处理_多模态ocr

0. 前言1. 人工智能发展历程 1.1 传统机器学习1.2 深度学习1.3 多模态大模型时代 2. CCIG 文档图像智能分析与处理论坛 2.1 文档图像智能分析与处理的重要性和挑战2.2 文档图像智能分析与处理高峰论坛2.3 走进合合信息 3. 文档图像智能分析与处理 3.1 文档图像分析与预处理3.2 …

牛市中途深度调整,一览下半场值得关注的 Solana 生态五大潜力项目

近期有关加密货币的利空消息让市场行情一度陷入了恐慌之中&#xff0c;短期利空的落地也将伴随着接下来市场的蓄势。对于投资者来说&#xff0c;现在布局超跌潜力项目不失为一个不错的机会。作为本轮牛市值得关注的两大生态&#xff0c;Solana和TON的快速发展和吸金效应&#x…

微米级触觉感知的紧凑视触觉机器人皮肤

视触觉皮肤&#xff08;VTS&#xff09;分为涂层型、标记型和热致变色型。涂层的耐磨性和空间分辨率是涂层型VTS的核心问题。近期&#xff0c;北京邮电大学方斌教授联合中国地质大学&#xff08;北京&#xff09;杨义勇教授&#xff0c;在传感器领域Q1期刊IEEE Sensors Journal…

存储相关基本知识:oss\s3\文件存储\块存储\

存储 常见的存储格式 文件存储会以文件和文件夹的层次结构来整理和呈现数据&#xff1b;块存储会将数据拆分到任意划分且大小相同的卷中;对象存储会管理数据并将其链接至关联的元数据。 DAS和SAN是基于物理块的存储方式&#xff0c;而NAS是基于文件的存储方式。 在DAS和SAN中…

Conformal low power-2.电源感知等效性检查

电源感知等效性检查 ■ 第24页&#xff1a;电源感知等效性检查概述 ■ 第24页&#xff1a;启动低功耗&#xff08;等效性检查&#xff09;软件 ■ 第25页&#xff1a;电源感知等效性检查流程 ■ 第28页&#xff1a;电源感知等效性检查示例Do文件 电源感知等效性检查概述…

亚马逊关键词优化全攻略:自养号测评让你的产品跃居首页

常常听到亚马逊运营吐槽&#xff1a; 为啥我的产品就是上不了首页呢&#xff1f; 我的关键词要怎么优化才能排名靠前啊&#xff1f; 的确&#xff0c;每天都有无数个卖家在想方设法让自己的产品排到首页&#xff0c;所以产品的竞争激烈程度不言而喻。 我们在亚马逊运营中&a…