赞
踩
【1】命令行解析
【1.1】cmdline 跨平台改进 -- 支持 win32 与 linux
错误 1,fatal error C1083: 无法打开包括文件:“cxxabi.h”: No such file or directory
- 原文件中
- #include <cxxabi.h>
-
- 修改
- 将该头文件引入删除,改为
- #include "abi.h"
abi.h 头文件如下
- #ifndef ABI_H
- #define ABI_H
-
- #include <string>
-
- #ifndef WIN32
- #include <cxxabi.h>
-
- static inline std::string demangle(const std::string &name)
- {
- int status=0;
- char *p=abi::__cxa_demangle(name.c_str(), 0, 0, &status);
- std::string ret(p);
- free(p);
- return ret;
- }
- #else
-
- #include <windows.h>
- #include <Dbghelp.h>
- #pragma comment(lib,"dbghelp.lib")
-
- static inline std::string demangle(const std::string &name)
- {
- TCHAR szUndecorateName[256];
- memset(szUndecorateName, 0, 256);
- UnDecorateSymbolName(name.c_str(), szUndecorateName, 256, 0);
- return szUndecorateName;
- }
- #endif
-
- #endif // ABI_H
错误 2,error C2589: '(' : illegal token on right side of '::',error C2143: syntax error : missing ';' before '::'
- max_width=std::max(max_width, ordered[i]->name().length());
- 改为
- max_width=std::max< size_t>(max_width, ordered[i]->name().length());
【1.2】cmdline 示例
示例代码
- // cmdline 相关头文件
- #include "cmdline.h"
-
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- //*******************************************************
- // 命令行参数解析相关
- //*******************************************************
- // 创建一个命令行解析器
- cmdline::parser a_cmdline;
-
- // 加入指定类型的输入參数
- // 第一个參数:长名称
- // 第二个參数:短名称(‘\0‘表示没有短名称)
- // 第三个參数:參数描写叙述
- // 第四个參数:bool值,表示该參数是否必须存在(可选。默认值是false)
- // 第五个參数:參数的默认值(可选,当第四个參数为false时该參数有效)
- a_cmdline.add<string>("host", 'h', "host name", true, "");
-
- // 第六个參数用来对參数加入额外的限制
- // 这里端口号被限制为必须是1到65535区间的值,通过cmdline::range(1, 65535)进行限制
- a_cmdline.add<int>("port", 'p', "port number", false, 80, cmdline::range(1, 65535));
-
- // cmdline::oneof() 能够用来限制參数的可选值
- a_cmdline.add<string>("type", 't', "protocol type", false, "http", cmdline::oneof<string>("http", "https", "ssh", "ftp"));
-
- // 也能够定义bool值,通过调用不带类型的add方法
- a_cmdline.add("gzip", '\0', "gzip when transfer");
-
- // 执行解析器
- // 仅仅有当全部的參数都有效时他才会返回
- // 假设有无效參数,解析器会输出错误消息。然后退出程序
- // 假设有‘--help‘或-?,‘这种帮助标识被指定,解析器输出帮助信息。然后退出程序
- a_cmdline.parse_check(argc, argv);
-
- cout << a_cmdline.get<string>("type") << "://"
- << a_cmdline.get<string>("host") << ":"
- << a_cmdline.get<int>("port") << endl;
-
- Dialog w;
- w.show();
-
- return a.exec();
- }
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文件
- syntax = "proto3";
- package transfer_protocol;
- message transfer_message
- {
- int32 userId = 1;
- string requestMessage = 2;
- string responseMessage = 3;
- }
- 语法格式
- protoc.exe -I=源地址 --cpp_out=目标地址 xxx.proto
- -I:主要用于指定待编译的 .proto 消息定义文件所在的目录,即可能出现的包含文件的路径;
- 此处指定的路径不能为空,
- 如果是当前目录,直接使用.;
- 如果是子目录,直接使用子目录相对径,如:file1/file2/file3;
- 如果要编译的文件指定的文件路径为file3/test.proto,那么应这么写-I=file1/file2,而不要一直写到file3
-
- 命令范例
- protoc.exe -I=./ --cpp_out=./ transfer_protocol.proto
引入对应的工程中使用
QT 中引入 Protobuf 对应的头文件与库,并将对应的 .proto 文件生成的 .cc/.h 文件拷贝到项目工程中;
问题与解决方案
问题一
解决方案
- 在 pro 文件中添加
- DEFINES += PROTOBUF_USE_DLLS
【4.3.2】Linux 编译安装 Protobuf
- sudo apt-get install autoconf automake libtool curl make g++ unzip
- tar -zxvf protobuf-3.15.5.tar.gz
- cd ./protobuf-3.15.5
- sudo ./autogen.sh
- sudo ./configure
- sudo make
- sudo make install
- sudo ldconfig
【4.4】Curl
【4.3.1】VS2017 编译安装 libCurl
编译步骤
- 解压文件,进入源码目录 curl-7.75.0,运行 buildconf.bat
- 进入 curl-7.75.0 目录下的 winbuild 目录,复制路径
- 打开适用于 VS 2017 的 X86 本机工具命令提示符
- 切换到 winbuild 目录
- 执行 nmake /f Makefile.vc mode=dll VC=14 MACHINE=x86 DEBUG=no
- 编译
- 编译完成后会在 builds 目录中出现动态库
编译选项详解
- nmake /f Makefile.vc mode=<static or dll> <options>
-
- where <options> is one or many of:
- VC=<6,7,8,9,10,11,12,14,15> - VC versions
- WITH_DEVEL=<path> - Paths for the development files (SSL, zlib, etc.)
- Defaults to sibbling directory deps: ../deps
- Libraries can be fetched at http://windows.php.net/downloads/php-sdk/deps/
- Uncompress them into the deps folder.
- WITH_SSL=<dll or static> - Enable OpenSSL support, DLL or static
- WITH_NGHTTP2=<dll or static> - Enable HTTP/2 support, DLL or static
- WITH_MBEDTLS=<dll or static> - Enable mbedTLS support, DLL or static
- WITH_CARES=<dll or static> - Enable c-ares support, DLL or static
- WITH_ZLIB=<dll or static> - Enable zlib support, DLL or static
- WITH_SSH2=<dll or static> - Enable libSSH2 support, DLL or static
- ENABLE_SSPI=<yes or no> - Enable SSPI support, defaults to yes
- ENABLE_IPV6=<yes or no> - Enable IPv6, defaults to yes
- ENABLE_IDN=<yes or no> - Enable use of Windows IDN APIs, defaults to yes
- Requires Windows Vista or later
- ENABLE_WINSSL=<yes or no> - Enable native Windows SSL support, defaults to yes
- GEN_PDB=<yes or no> - Generate Program Database (debug symbols for release build)
- DEBUG=<yes or no> - Debug builds
- MACHINE=<x86 or x64> - Target architecture (default is x86)
- CARES_PATH=<path to cares> - Custom path for c-ares
- MBEDTLS_PATH=<path to mbedTLS> - Custom path for mbedTLS
- NGHTTP2_PATH=<path to HTTP/2> - Custom path for nghttp2
- SSH2_PATH=<path to libSSH2> - Custom path for libSSH2
- SSL_PATH=<path to OpenSSL> - Custom path for OpenSSL
- ZLIB_PATH=<path to zlib> - Custom path for zlib
编译结果图示
【4.3.2】Linux 编译安装 libCurl
- tar -zxvf curl-7.71.0.tar.gz
- cd ./curl-7.71.0
- sudo ./configure
- sudo make
- 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下的命令行参数解析
【5】log4cxx日志库在Windows+VS2017上的编译使用
【7】windows 下编译好的 log4cxx库,包含完整头文件、debug、release 和一个Qt示例程序
【8】基于log4j的记录器:log4cpp vs log4cplus vs log4cxx
【9】Windows10 VS2017 C++ xml解析(tinyxml2库)
【11】【libcurl】Visual Studio 2017编译和配置libcurl开发环境
【12】Visual Studio构建工具现在包括VS2017和VS2015 MSVC工具集
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。