Poco для C++: полное руководство с примерами
Библиотека POCO (POrtable COmponents) — это мощный набор кроссплатформенных классов и компонентов для языка C++. Она предоставляет готовые решения для самых распространённых задач: работа с сетью, потоками, файлами, XML, JSON, базами данных, криптографией и многим другим. POCO часто называют "швейцарским ножом" для C++ разработчика, так как она значительно ускоряет разработку, избавляя от необходимости писать низкоуровневый код для каждой операционной системы.
Зачем нужна POCO? Во-первых, это переносимость: один и тот же код будет работать на Windows, Linux, macOS, iOS и Android без изменений. Во-вторых, это современный C++: библиотека использует стандарт C++17/20, шаблоны, RAII и другие современные идиомы. В-третьих, это проверенная временем стабильность: POCO существует с 2004 года, используется в тысячах проектов по всему миру, включая промышленное ПО, встраиваемые системы и финансовые приложения.
Эта статья — максимально подробное руководство для начинающих и опытных разработчиков. Мы рассмотрим установку, основные классы и методы, напишем реальный практический пример и разберём типичные ошибки. К концу статьи вы сможете уверенно использовать POCO в своих проектах.
Установка
POCO можно установить несколькими способами. Рекомендуемый способ — использовать пакетный менеджер вашей системы или собрать из исходников.
Linux (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install libpoco-dev
macOS (Homebrew)
brew install poco
Windows (vcpkg)
vcpkg install poco
Сборка из исходников (универсальный способ)
git clone https://github.com/pocoproject/poco.git
cd poco
mkdir cmake-build && cd cmake-build
cmake ..
cmake --build . --config Release
sudo cmake --install .
-I/usr/include и -L/usr/lib.
Быстрый старт: минимальный рабочий пример
Напишем простейшую программу, которая выводит текущую дату и время, используя класс Poco::DateTime и Poco::DateTimeFormatter.
// main.cpp
#include <iostream>
#include <Poco/DateTime.h>
#include <Poco/DateTimeFormatter.h>
int main() {
// Создаём объект с текущим временем
Poco::DateTime now;
// Форматируем дату в читаемый вид
std::string formatted = Poco::DateTimeFormatter::format(now, "%Y-%m-%d %H:%M:%S");
std::cout << "Текущее время: " << formatted << std::endl;
return 0;
}
Компиляция (Linux/macOS):
g++ -std=c++17 main.cpp -lPocoFoundation -o datetime_example
./datetime_example
Вывод:
Текущее время: 2025-03-15 14:30:22
Основные методы и классы (минимум 8)
1. Poco::DateTime — работа с датой и временем
Создаёт объект даты/времени. Позволяет получать отдельные компоненты (год, месяц, день и т.д.), выполнять арифметические операции (сложение/вычитание дней, часов).
#include <iostream>
#include <Poco/DateTime.h>
int main() {
Poco::DateTime dt(2025, 3, 15, 10, 30, 0);
std::cout << "Год: " << dt.year() << std::endl;
std::cout << "Месяц: " << dt.month() << std::endl;
std::cout << "День: " << dt.day() << std::endl;
// Прибавляем 7 дней
dt += Poco::Timespan(7, 0, 0, 0, 0);
std::cout << "Новый день: " << dt.day() << std::endl;
return 0;
}
2. Poco::File — работа с файловой системой
Предоставляет методы для проверки существования файла, создания/удаления, копирования, перемещения, получения размера и атрибутов.
#include <iostream>
#include <Poco/File.h>
int main() {
Poco::File f("test.txt");
if (!f.exists()) {
f.createFile();
std::cout << "Файл создан" << std::endl;
}
std::cout << "Размер: " << f.getSize() << " байт" << std::endl;
std::cout << "Путь: " << f.path() << std::endl;
return 0;
}
3. Poco::Net::HTTPClientSession — HTTP-клиент
Устанавливает соединение с HTTP-сервером, отправляет запросы (GET, POST и т.д.) и получает ответы. Поддерживает прокси, SSL, куки.
#include <iostream>
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/StreamCopier.h>
int main() {
Poco::Net::HTTPClientSession session("example.com", 80);
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/");
session.sendRequest(request);
Poco::Net::HTTPResponse response;
std::istream& rs = session.receiveResponse(response);
std::cout << "Статус: " << response.getStatus() << std::endl;
std::string body;
Poco::StreamCopier::copyToString(rs, body);
std::cout << "Тело ответа (первые 200 символов): " << body.substr(0, 200) << std::endl;
return 0;
}
4. Poco::JSON::Parser — парсинг JSON
Разбирает JSON-строку или поток в объектную модель (Poco::Dynamic::Var). Поддерживает вложенные объекты, массивы, числа, строки, булевы значения.
#include <iostream>
#include <sstream>
#include <Poco/JSON/Parser.h>
#include <Poco/Dynamic/Var.h>
int main() {
std::string jsonStr = R"({"name": "Alice", "age": 30, "skills": ["C++", "Python"]})";
std::istringstream iss(jsonStr);
Poco::JSON::Parser parser;
Poco::Dynamic::Var result = parser.parse(iss);
Poco::JSON::Object::Ptr obj = result.extract<Poco::JSON::Object::Ptr>();
std::cout << "Name: " << obj->getValue<std::string>("name") << std::endl;
std::cout << "Age: " << obj->getValue<int>("age") << std::endl;
Poco::JSON::Array::Ptr skills = obj->getArray("skills");
for (size_t i = 0; i < skills->size(); ++i) {
std::cout << "Skill " << i << ": " << skills->getElement<std::string>(i) << std::endl;
}
return 0;
}
5. Poco::Thread — работа с потоками
Создаёт и управляет отдельным потоком выполнения. Поддерживает запуск с функцией или объектом Runnable, ожидание завершения (join), приоритеты.
#include <iostream>
#include <Poco/Thread.h>
#include <Poco/Runnable.h>
class MyTask : public Poco::Runnable {
void run() override {
for (int i = 0; i < 5; ++i) {
std::cout << "Поток работает: " << i << std::endl;
Poco::Thread::sleep(200);
}
}
};
int main() {
MyTask task;
Poco::Thread thread("worker");
thread.start(task);
thread.join(); // ждём завершения
std::cout << "Поток завершён" << std::endl;
return 0;
}
6. Poco::Logger — логирование
Гибкая система логирования с поддержкой уровней (trace, debug, info, warning, error, fatal), каналов (консоль, файл, syslog) и форматирования.
#include <iostream>
#include <Poco/Logger.h>
#include <Poco/PatternFormatter.h>
#include <Poco/ConsoleChannel.h>
int main() {
// Настраиваем корневой логгер
Poco::AutoPtr<Poco::PatternFormatter> pFormatter(new Poco::PatternFormatter("%Y-%m-%d %H:%M:%S [%p] %s: %t"));
Poco::AutoPtr<Poco::ConsoleChannel> pChannel(new Poco::ConsoleChannel());
pChannel->setFormatter(pFormatter);
Poco::Logger& logger = Poco::Logger::get("TestLogger");
logger.setChannel(pChannel);
logger.information("Это информационное сообщение");
logger.warning("Это предупреждение");
logger.error("Это ошибка");
return 0;
}
7. Poco::Util::Application — основа приложения
Также в библиотеке
Обработка изображений в Kotlin: resize и crop с библиотекой Kamel
WireMock.Net для C# (.NET): полное руководство с примерами
Мониторинг приложений на Rust: библиотеки и инструменты для отслеживания производительности
ARKit для Swift: полное руководство с примерами
NaturalLanguage для Swift: полное руководство с примерами