Hay una línea muy clara en la arena entre la plataforma cruzada y la plataforma única:
¿Utiliza un programa solo las API expuestas por la Biblioteca estándar en la que está construido?
Si apunta a una implementación estándar, cualquier plataforma que implemente ese estándar debería, en teoría, compilar y ejecutar su programa correctamente. Hay muchas excepciones, pero en general, si evita los trucos ingeniosos, debería poder evitar muchas de esas excepciones.
La razón por la cual este problema surge específicamente con C ++ es que, durante mucho tiempo, la Biblioteca estándar de C ++ no incluyó muchos módulos que sean útiles para programas no triviales. La concurrencia y la GUI son las dos grandes. Esto significaba que un programa creado utilizando solo la Biblioteca estándar de C ++ no podía tener muchas de las características que esperamos del software moderno.
¿Cómo escribimos software multiplataforma que hace cosas que la Biblioteca estándar no admite?
Usted menciona "bibliotecas multiplataforma", que en la práctica normalmente se denominan "marcos" o "kits de herramientas" en función de su alcance. La forma de escribir software en C ++ que sea multiplataforma es apuntar no solo a la Biblioteca estándar, sino a un marco que se basa en las plataformas de destino.
Esencialmente, terminas externalizando los bits específicos de la plataforma a otra biblioteca. Por ejemplo, wxWidgets es un marco popular. Puede usar sus clases para construir una GUI y funcionalidad relacionada (por ejemplo, cuadros de diálogo estándar para seleccionar archivos). Debajo de las cubiertas, utiliza compilación condicional para implementar la GUI usando la GUI nativa para cada plataforma. Pero como usuario de la biblioteca, nada de eso le importa.
Nota histórica: aquí en 2015 los compiladores y bibliotecas de C ++ son, en su mayor parte, realmente buenos. Regresar unos años, y eso no es cierto. C ++ no tenía un estándar oficial hasta 1998, muchos años después de su inicio. A los proveedores les llevó mucho tiempo actualizar sus compiladores y bibliotecas para implementar el estándar correctamente. Las extensiones específicas del proveedor abundaban (y todavía existen, en realidad). Algunos compiladores tenían encabezados y funcionalidad no estándar. La portabilidad del código era prácticamente inexistente. La reputación de C ++ en términos de portabilidad aún sufre.