导读
上一篇说了《boost编译链接》相关内容,这节要说的是另一个C++库POCO。
先看下github基本资料:
从图中我们可以看到,poco的Star和Fork量比boost还要高出不少,虽然POCO身边的人用的不多,但是这个库绝对可以用上一用。(之前还用过一个Neptune的C++库,查了下github,只有几十人的Star,以后抛弃掉吧)。
最后再简单说下POCO的优点吧:
- C++ 类库的集合,在概念上
类似于 Java 类库或 .NET Framework
。- 专注于解决经常遇到的
实际问题
。- 专注于“互联网时代”以
网络为中心
的应用。- 用高效、现代的 100%
ANSI/ISO 标准
C++ 编写。- 基于并
补充 C++ 标准库/STL
。跨平台
,高度便携,可在从嵌入式到服务器的许多不同平台上使用。开源
,在Boost Software License下获得许可。
开发环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2022-5-17 | |
操作系统 | Win11-21H2 | 22000.588 |
VS2019 | ||
工作目录 | J:_ALL\CODE\vcpkg | |
POCO | 1.11.2 |
POCO 与 Boost
关于 Boost,尽管存在一些功能重叠,但最好将 POCO 视为 Boost 的补充
(而不是替代)。并排使用 Boost 和 POCO 是很常见的情况。
编译过程
这里,我们编译最新的静态库,不涉及版本问题,所以直接执行命令
.\vcpkg.exe install Poco:x86-windows-static
即可编译安装POCO库。
中途遇到下面错误,表示下载依赖组件失败,多尝试几次即可。
最后执行命令
.\vcpkg.exe list
,可以查看已经安装的poco库。
POCO库实战
编写测试代码
这里我们直接编写下面类,用于App启动加载配置逻辑。
#pragma once
#include <vector>
#include <Poco/Util/Application.h>
class CMyApp : public Poco::Util::Application
{
public:
void ReloadConfig(){}
protected:
void initialize(Poco::Util::Application& self)
{
loadConfiguration("config/my_test_MFC.properties"); // load default configuration files, if present
loadConfiguration("config/autoTest.properties");
Application::initialize(self);
}
void uninitialize()
{
Application::uninitialize();
}
};
配置依赖目录
配置过程就是将头文件目录和库目录设置到“属性页”,如下面两幅图所示。
不过需要注意一点,debug的库目录需要引入两个目录(libexpatMD.lib库文件没有debug版本的),配置如下所示:
/LIBPATH:"J:\_ALL\CODE\vcpkg\vcpkg\installed\x86-windows-static\debug\lib"
/LIBPATH:"J:\_ALL\CODE\vcpkg\vcpkg\installed\x86-windows-static\lib"
引入头文件和库
#ifdef _DEBUG
#define MY_COMMON_LIB_TYPE "d"
#define MY_BOOST_LIB_TYPE "-mt-gd"
#define MY_POCO_LIB_TYPE "mtd"
#else
#define MY_COMMON_LIB_TYPE ""
#define MY_BOOST_LIB_TYPE "-mt"
#define MY_POCO_LIB_TYPE "mt"
#endif
// POCO依赖库
#pragma comment(lib, "libexpatMD.lib")
#pragma comment(lib, "zlib" MY_COMMON_LIB_TYPE ".lib")
#pragma comment(lib, "pcre" MY_COMMON_LIB_TYPE ".lib")
#pragma comment(lib, "PocoFoundation" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoUtil" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoJSON" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoXML" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoCppParser" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoZip" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoActiveRecord" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoData" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoDataODBC" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoEncodings" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoMongoDB" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoNet" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoRedis" MY_POCO_LIB_TYPE ".lib")
#pragma comment(lib, "PocoSevenZip" MY_POCO_LIB_TYPE ".lib")
编译中遇到的问题
poco依赖了pcre库,需要引入该库。
#pragma comment(lib, "pcre" MY_COMMON_LIB_TYPE ".lib")
ps: PCRE (Perl Compatible Regular Expressions) 库是一组使用与 Perl 5 相同的语法和语义实现正则表达式模式匹配的函数。
Poco::Util::Application中会引入XML相关库,该库会使用到xml解析的库libexpatMD.lib,引入即可消除该报错:
#pragma comment(lib, "libexpatMD.lib")
release下,报如下错误,缺少了zlib库,引入即可:
#pragma comment(lib, "zlib" MY_COMMON_LIB_TYPE ".lib")
参考资料
- poco gitbhub地址 https://github.com/pocoproject/poco
- boost gitbhub地址 https://github.com/boostorg/boost
- qq群:夜猫逐梦技术交流裙/953949723
**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。