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

项目目录结构

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;//数据库ip
	unsigned 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

 

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

 

相关推荐

  1. 怎样为Flask服务器配置跨域资源共享

    2024-07-11 00:00:04       12 阅读
  2. ubuntu 14.04 配置samba共享服务

    2024-07-11 00:00:04       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 00:00:04       4 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 00:00:04       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 00:00:04       4 阅读
  4. Python语言-面向对象

    2024-07-11 00:00:04       4 阅读

热门阅读

  1. Vue 3 组件通信全解:从基础到高级技巧

    2024-07-11 00:00:04       10 阅读
  2. android gradle开发基础

    2024-07-11 00:00:04       7 阅读
  3. 排序算法_冒泡排序

    2024-07-11 00:00:04       7 阅读
  4. std::deque和std::list的区别是什么

    2024-07-11 00:00:04       6 阅读
  5. 华为OD机试(C卷,200分)- 字符串拼接、田忌赛马

    2024-07-11 00:00:04       8 阅读
  6. 如何设置PHP wkhtmltopdf

    2024-07-11 00:00:04       8 阅读
  7. yolov5中训练长条型目标召回率低问题

    2024-07-11 00:00:04       11 阅读
  8. openssl error:0A000126:SSL routines:ssl3_read_n:unexpected eof

    2024-07-11 00:00:04       12 阅读
  9. 各种软件启动方式

    2024-07-11 00:00:04       9 阅读