项目目录结构
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
如上图所示,输出了配置信息