当前位置:   article > 正文

【C/C++基础进阶系列】实战记录 -- 跨平台基础组件 (命令行解析,日志,配置文件,网络请求)_

【C/C++基础进阶系列】实战记录 -- 跨平台基础组件 (命令行解析,日志,配置文件,网络请求)

【1】命令行解析

【1.1】cmdline 跨平台改进 -- 支持 win32 与 linux

错误 1,fatal error C1083: 无法打开包括文件:“cxxabi.h”: No such file or directory

  1. 原文件中
  2. #include <cxxabi.h>
  3. 修改
  4. 将该头文件引入删除,改为
  5. #include "abi.h"

abi.h 头文件如下

  1. #ifndef ABI_H
  2. #define ABI_H
  3. #include <string>
  4. #ifndef WIN32
  5. #include <cxxabi.h>
  6. static inline std::string demangle(const std::string &name)
  7. {
  8. int status=0;
  9. char *p=abi::__cxa_demangle(name.c_str(), 0, 0, &status);
  10. std::string ret(p);
  11. free(p);
  12. return ret;
  13. }
  14. #else
  15. #include <windows.h>
  16. #include <Dbghelp.h>
  17. #pragma comment(lib,"dbghelp.lib")
  18. static inline std::string demangle(const std::string &name)
  19. {
  20. TCHAR szUndecorateName[256];
  21. memset(szUndecorateName, 0, 256);
  22. UnDecorateSymbolName(name.c_str(), szUndecorateName, 256, 0);
  23. return szUndecorateName;
  24. }
  25. #endif
  26. #endif // ABI_H

错误 2,error C2589: '(' : illegal token on right side of '::',error C2143: syntax error : missing ';' before '::'

  1. max_width=std::max(max_width, ordered[i]->name().length());
  2. 改为
  3. max_width=std::max< size_t>(max_width, ordered[i]->name().length());

【1.2】cmdline 示例

示例代码

  1. // cmdline 相关头文件
  2. #include "cmdline.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. //*******************************************************
  7. // 命令行参数解析相关
  8. //*******************************************************
  9. // 创建一个命令行解析器
  10. cmdline::parser a_cmdline;
  11. // 加入指定类型的输入參数
  12. // 第一个參数:长名称
  13. // 第二个參数:短名称(‘\0‘表示没有短名称)
  14. // 第三个參数:參数描写叙述
  15. // 第四个參数:bool值,表示该參数是否必须存在(可选。默认值是false
  16. // 第五个參数:參数的默认值(可选,当第四个參数为false时该參数有效)
  17. a_cmdline.add<string>("host", 'h', "host name", true, "");
  18. // 第六个參数用来对參数加入额外的限制
  19. // 这里端口号被限制为必须是165535区间的值,通过cmdline::range(1, 65535)进行限制
  20. a_cmdline.add<int>("port", 'p', "port number", false, 80, cmdline::range(1, 65535));
  21. // cmdline::oneof() 能够用来限制參数的可选值
  22. a_cmdline.add<string>("type", 't', "protocol type", false, "http", cmdline::oneof<string>("http", "https", "ssh", "ftp"));
  23. // 也能够定义bool值,通过调用不带类型的add方法
  24. a_cmdline.add("gzip", '\0', "gzip when transfer");
  25. // 执行解析器
  26. // 仅仅有当全部的參数都有效时他才会返回
  27. // 假设有无效參数,解析器会输出错误消息。然后退出程序
  28. // 假设有‘--help‘或-?,‘这种帮助标识被指定,解析器输出帮助信息。然后退出程序
  29. a_cmdline.parse_check(argc, argv);
  30. cout << a_cmdline.get<string>("type") << "://"
  31. << a_cmdline.get<string>("host") << ":"
  32. << a_cmdline.get<int>("port") << endl;
  33. Dialog w;
  34. w.show();
  35. return a.exec();
  36. }

QT 命令行参数设置

【2】日志

log4cpp vs log4cplus vs log4cxx 的对比,详见 基于log4j的记录器:log4cpp vs log4cplus vs log4cxx

【2.1】VS2017 编译安装 Log4Cxx

待添加...

【2.2】Linux 编译安装 Log4Cxx

待添加...

【3】配置文件

【3.1】TinyXml

【3.1.1】VS2017 编译安装 TinyXml

直接下载 TinyXml 工程,使用 VS2017 打开,重新设置解决方案(设置 Windows SDK 版本以及平台工具集),即可;

下载路径,https://github.com/leethomason/tinyxml2/releases

【3.1.2】Linux 编译安装 TinyXml

待添加...

【4】网络请求

【4.1】JsonCpp

【4.1.1】VS2017 编译安装 JsonCpp

使用 cmake 配置 jsoncpp 工程

使用 VS2017 打开工程并编译

【4.1.2】Linux 编译安装 JsonCpp

待添加...

【4.3】Protobuf

【4.3.1】VS2017 编译安装 Protobuf

protobuf 下载,https://github.com/protocolbuffers/protobuf/releases

步骤,下载源码-->cmake生成vs工程-->vs编译(所需lib文件和protoc.exe)-->编写.proto文件并使用protoc生成对应的.h和.cc文件-->引入对应的工程中使用;

cmake生成vs工程

vs编译(所需lib文件和protoc.exe)

分别编译 libprotobuf 和 protoc 这两个项目

编写.proto文件并使用protoc生成对应的.h和.cc文件

  1. syntax = "proto3";
  2. package transfer_protocol;
  3. message transfer_message
  4. {
  5. int32 userId = 1;
  6. string requestMessage = 2;
  7. string responseMessage = 3;
  8. }
  1. 语法格式
  2. protoc.exe -I=源地址 --cpp_out=目标地址 xxx.proto
  3. -I:主要用于指定待编译的 .proto 消息定义文件所在的目录,即可能出现的包含文件的路径;
  4. 此处指定的路径不能为空,
  5. 如果是当前目录,直接使用.;
  6. 如果是子目录,直接使用子目录相对径,如:file1/file2/file3
  7. 如果要编译的文件指定的文件路径为file3/test.proto,那么应这么写-I=file1/file2,而不要一直写到file3
  8. 命令范例
  9. protoc.exe -I=./ --cpp_out=./ transfer_protocol.proto

引入对应的工程中使用

QT 中引入 Protobuf 对应的头文件与库,并将对应的 .proto 文件生成的 .cc/.h 文件拷贝到项目工程中; 

问题与解决方案

问题一

解决方案

  1. 在 pro 文件中添加
  2. DEFINES += PROTOBUF_USE_DLLS

【4.3.2】Linux 编译安装 Protobuf

  1. sudo apt-get install autoconf automake libtool curl make g++ unzip
  2. tar -zxvf protobuf-3.15.5.tar.gz
  3. cd ./protobuf-3.15.5
  4. sudo ./autogen.sh
  5. sudo ./configure
  6. sudo make
  7. sudo make install
  8. sudo ldconfig

【4.4】Curl

【4.3.1】VS2017 编译安装 libCurl

编译步骤

  1. 解压文件,进入源码目录 curl-7.75.0,运行 buildconf.bat
  2. 进入 curl-7.75.0 目录下的 winbuild 目录,复制路径
  3. 打开适用于 VS 2017 的 X86 本机工具命令提示符
  4. 切换到 winbuild 目录
  5. 执行 nmake /f Makefile.vc mode=dll VC=14 MACHINE=x86 DEBUG=no
  6. 编译
  7. 编译完成后会在 builds 目录中出现动态库

编译选项详解

  1. nmake /f Makefile.vc mode=<static or dll> <options>
  2. where <options> is one or many of:
  3. VC=<6,7,8,9,10,11,12,14,15> - VC versions
  4. WITH_DEVEL=<path> - Paths for the development files (SSL, zlib, etc.)
  5. Defaults to sibbling directory deps: ../deps
  6. Libraries can be fetched at http://windows.php.net/downloads/php-sdk/deps/
  7. Uncompress them into the deps folder.
  8. WITH_SSL=<dll or static> - Enable OpenSSL support, DLL or static
  9. WITH_NGHTTP2=<dll or static> - Enable HTTP/2 support, DLL or static
  10. WITH_MBEDTLS=<dll or static> - Enable mbedTLS support, DLL or static
  11. WITH_CARES=<dll or static> - Enable c-ares support, DLL or static
  12. WITH_ZLIB=<dll or static> - Enable zlib support, DLL or static
  13. WITH_SSH2=<dll or static> - Enable libSSH2 support, DLL or static
  14. ENABLE_SSPI=<yes or no> - Enable SSPI support, defaults to yes
  15. ENABLE_IPV6=<yes or no> - Enable IPv6, defaults to yes
  16. ENABLE_IDN=<yes or no> - Enable use of Windows IDN APIs, defaults to yes
  17. Requires Windows Vista or later
  18. ENABLE_WINSSL=<yes or no> - Enable native Windows SSL support, defaults to yes
  19. GEN_PDB=<yes or no> - Generate Program Database (debug symbols for release build)
  20. DEBUG=<yes or no> - Debug builds
  21. MACHINE=<x86 or x64> - Target architecture (default is x86)
  22. CARES_PATH=<path to cares> - Custom path for c-ares
  23. MBEDTLS_PATH=<path to mbedTLS> - Custom path for mbedTLS
  24. NGHTTP2_PATH=<path to HTTP/2> - Custom path for nghttp2
  25. SSH2_PATH=<path to libSSH2> - Custom path for libSSH2
  26. SSL_PATH=<path to OpenSSL> - Custom path for OpenSSL
  27. ZLIB_PATH=<path to zlib> - Custom path for zlib

编译结果图示

【4.3.2】Linux 编译安装 libCurl

  1. tar -zxvf curl-7.71.0.tar.gz
  2. cd ./curl-7.71.0
  3. sudo ./configure
  4. sudo make
  5. sudo make install

问题与解决方案

问题一、error: possibly undefined macro: AC_PROG_LIBTOOL

解决方案,将 /usr/share/aclocal 相应的 .m4 文件拷贝到 /usr/local/share/aclocal 路径下

参考

1. 关于error: possibly undefined macro: AC_PROG_LIBTOOL问题解决

2. LIBTOOL is undefined 问题的解决方法

参考致谢

本博客为博主学习笔记,同时参考了网上众博主的博文以及相关专业书籍,在此表示感谢,本文若存在不足之处,请批评指正。

【1】cmdline学习

【2】cmdline轻量级的C++命令行解析库--windows

【3】c++:改造cmdline用于MSVC下的命令行参数解析

【4】ABI dependency #6

【5】log4cxx日志库在Windows+VS2017上的编译使用

【6】log4cxx Windows vs已配置好的工程

【7】windows 下编译好的 log4cxx库,包含完整头文件、debug、release 和一个Qt示例程序

【8】基于log4j的记录器:log4cpp vs log4cplus vs log4cxx

【9】Windows10 VS2017 C++ xml解析(tinyxml2库)

【10】vs2017编译使用jsoncpp

【11】【libcurl】Visual Studio 2017编译和配置libcurl开发环境

【12】Visual Studio构建工具现在包括VS2017和VS2015 MSVC工具集

【13】C++对象的JSON序列化与反序列化探索完结-列表的序列化与反序列化

【14】protobuf(C++)的使用(windows)

【15】windows 下使用 protobuf

【16】Windows + Qt Creator + Protobuf的编译和使用历程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/65267?site
推荐阅读
相关标签
  

闽ICP备14008679号