Bibliotecas y frameworks populares
C++ no tiene un ecosistema único “estándar” como npm en JavaScript o crates.io en Rust, por lo que el conjunto de bibliotecas en uso depende en gran medida del dominio. Aun así, hay algunos nombres que aparecen en las ofertas de trabajo y en los proyectos con más frecuencia que el resto, y esos son los que se recopilan a continuación.
No intentes aprender todo a la vez. Es mucho más útil sentirse realmente cómodo con una o dos bibliotecas de tu propio campo que conocer una docena superficialmente. La forma más sencilla de incorporarlas es a través de los gestores de paquetes Conan o vcpkg: consulta el Conjunto de herramientas del lenguaje.
Este es un artículo de descripción general y un punto de partida para la navegación, no un catálogo completo. La cantidad de bibliotecas que existen realmente es de órdenes de magnitud mayor, y para cualquier tarea específica casi siempre hay algo más por ahí: busca dentro de tu propio dominio de problemas, mira qué usan proyectos similares y verifica las listas actualizadas (por ejemplo, awesome-cpp). El objetivo de esta lista es dar un punto de apoyo a aquellos que recién están comenzando.
Las herramientas de desarrollo (compiladores, depuradores, analizadores, frameworks de pruebas) están cubiertas en un artículo separado: Conjunto de herramientas del lenguaje.
Propósito general
-
Boost - boost.orgUna gran colección de bibliotecas que históricamente ha servido como un “campo de pruebas” para la biblioteca estándar: gran parte de lo que hoy forma parte del estándar (smart pointers,
filesystem,optional,variant) se probó por primera vez en Boost. Todavía es útil ahora: contiene cosas de las que el estándar aún carece. La otra cara de la moneda es el tamaño: incorporar todo Boost por el bien de una función es una mala idea; la mayoría de sus bibliotecas se pueden tomar por separado. -
{fmt} - github.com/fmtlib/fmtUna biblioteca de formato de cadenas que se convirtió en la base de
std::formaten C++20. Más rápida y segura queprintf, más legible que los flujos (streams) deiostream. Tiene sentido si tu compilador aún no soportastd::formato si necesitas capacidades más allá del estándar. -
spdlog - github.com/gabime/spdlogUna biblioteca de registro (logging) rápida construida sobre {fmt}. Soporta la salida a archivos con rotación, a una consola con resaltado y un modo asincrónico. El registro es una de las principales herramientas de diagnóstico en producción, cuando adjuntar un depurador (debugger) es imposible.
-
range-v3 - github.com/ericniebler/range-v3La implementación de referencia en la que se basó
std::rangesen C++20. Te permite escribir transformaciones de secuencias como una cadena, sin iteradores explícitos ni contenedores temporales. Es relevante si necesitas funciones que aún no han llegado al estándar o soporte para compiladores más antiguos.
Redes e intercambio de datos
-
Asio - think-async.com/AsioEl estándar de facto para la E/S asincrónica en C++ y la base de muchos proyectos de red. Existe en dos variantes: como una biblioteca independiente y como parte de Boost. Funciona bien con corrutinas de C++20. Sobre su base se ha propuesto repetidamente una biblioteca de red para el estándar.
-
nlohmann/json - github.com/nlohmann/jsonLa biblioteca más popular para trabajar con JSON en C++. Se valora por el hecho de que el código que la usa se ve casi como un lenguaje con soporte JSON integrado. Se incorpora como un solo archivo de encabezado (header). Si la velocidad de análisis en grandes volúmenes es crítica, vale la pena considerar alternativas más rápidas como simdjson o RapidJSON.
-
Protocol Buffers - protobuf.devUn formato de serialización binaria basado en esquemas de Google: la estructura de datos se describe en un archivo separado, a partir del cual se genera el código. Más compacto y más rápido que JSON, y el esquema brinda control sobre la compatibilidad de versiones, una propiedad importante cuando el cliente y el servidor no se actualizan al mismo tiempo.
-
gRPC - grpc.ioUn framework de llamadas a procedimientos remotos sobre Protocol Buffers y HTTP/2. Está muy extendido en las arquitecturas de microservicios, incluidas las configuraciones donde los servicios están escritos en diferentes lenguajes.
-
POCO - pocoproject.orgUn conjunto de bibliotecas multiplataforma para aplicaciones en red y de servidor: un cliente y servidor HTTP, acceso a bases de datos, análisis de XML y JSON, registro (logging). En espíritu, está más cerca de “baterías incluidas” que de un conjunto de bibliotecas específicas.
Interfaz gráfica de usuario
-
Qt - qt.ioEl framework más extendido para aplicaciones de escritorio en C++, que hace mucho tiempo superó los límites de una GUI: incluye redes, bases de datos, hilos (threads) y análisis de formatos. Es multiplataforma, con su propio IDE (Qt Creator). Un matiz importante es la licencia: la versión abierta se distribuye bajo LGPL/GPL, y un producto comercial cerrado puede requerir una licencia paga. Vale la pena estudiar los términos antes de comenzar el desarrollo.
Computación, gráficos y aprendizaje automático
-
OpenCV - opencv.orgEl estándar de facto en visión por computadora: procesamiento de imágenes y videos, detección de objetos, calibración de cámaras. Se utiliza en robótica, control de calidad industrial e imágenes médicas.
-
Eigen - libeigen.gitlab.ioUna biblioteca de álgebra lineal: matrices, vectores, resolución de sistemas de ecuaciones. Consta solo de archivos de encabezado y está agresivamente optimizada. Aparece a menudo en robótica, simulaciones y visión por computadora.
-
CUDA - developer.nvidia.com/cuda-toolkit y OpenCL - khronos.org/openclDos enfoques de computación en tarjetas gráficas. CUDA se ejecuta solo en hardware NVIDIA pero es más maduro y conveniente; OpenCL es un estándar abierto que funciona en hardware de varios proveedores. Tienen demanda cuando una tarea se paraleliza bien: computación científica, procesamiento de imágenes, aprendizaje automático.
-
LibTorch (PyTorch C++) - pytorch.org/cppdocs y TensorFlow - tensorflow.orgLas API de C++ de los dos principales frameworks de aprendizaje automático. El entrenamiento del modelo generalmente se realiza en Python, mientras que C++ se usa en la etapa de implementación: cuando un modelo terminado necesita ejecutarse dentro de una aplicación con requisitos de velocidad estrictos o sin depender de Python.
Interoperabilidad con otros lenguajes
-
pybind11 - github.com/pybind/pybind11Te permite convertir el código C++ en un módulo importable en Python. El escenario típico: la computación pesada está escrita en C++, mientras que la lógica de nivel superior y los experimentos se quedan en Python. Los envoltorios (wrappers) de muchos proyectos conocidos están basados en pybind11.