¿Se puede vincular una biblioteca compilada de C ++ 11 (lib, dll, etc.) en compiladores de C ++ anteriores?

12

¿Podrían los compiladores de C ++ más antiguos (por ejemplo, VS2008 y gcc3.4) vincularse con bibliotecas externas escritas en C ++ 11?

Mi opinión es que los archivos .lib de C ++ 11 son solo código de bytes en esta etapa, y no debería molestar a los compiladores más antiguos cómo se generó, siempre que sea de alguna manera resoluble y ejecutable.

Estoy desarrollando una pequeña biblioteca cuya API aún debería admitir usuarios de C ++ 03. Entonces, mirando hacia el futuro, me pregunto si está bien implementar mi biblioteca usando características útiles como std::unique_ptro tales, ¿o debo seguir boost::?

Konafa
fuente

Respuestas:

10

Siempre que su biblioteca solo use C ++ 11 en su implementación y no exponga las instalaciones o tipos de C ++ 11 públicamente, y especialmente si usa un enlace estático, entonces sí, esto es posible e incluso estándar.

Considere el caso común en el que una biblioteca expone una interfaz de nivel C (que puede ser utilizada por la mayor variedad de clientes) pero que se implementa internamente en C ++. Los clientes que se vinculan con una biblioteca de este tipo solo deben preocuparse por la API binaria pública (funciones exportadas), que se limitará a ser C / C ++ heredado para una máxima compatibilidad. Un programa Java puede vincularse a API de nivel C que se implementan internamente en C ++. Esto no significa que Java necesite "soportar C ++". Del mismo modo, un cliente C / C ++ de estilo antiguo puede vincularse a una API de nivel C o C ++ que internamente utiliza alguna versión más vanguardista de las bibliotecas de C ++ o cualquier otra biblioteca. Dos cosas separadas: lo que se requiere para vincular a la interfaz de la biblioteca, y lo que la biblioteca misma vincula internamente (o extrae estáticamente).

Simplemente no expones a los clientes de tu biblioteca a las dependencias de tu implementación.

Si puede vincular estáticamente sus dependencias (C ++ 11 o cualquier otra cosa) a su biblioteca, esto es limpio y autónomo. La biblioteca es un verdadero cuadro negro: nada más que bytecode. Pero incluso si su biblioteca se vincula a sus dependencias a través del enlace "dinámico implícito" (no debe confundirse con el tipo de LoadLibrary / GetProcAddress explícito y los métodos similares en * nix y OS X), los clientes más antiguos aún deberían poder vincularse a esa biblioteca interfaz pública, incluso si no pudieran vincularse a las bibliotecas de las que depende la biblioteca .

jdevlin
fuente
1
¡Excelente! Eso es exactamente lo que esperaba. No tengo la intención de usar C ++ 11 ampliamente, pero es bueno saber que podría ingresar una función lambda o dos en mi implementación oculta cuando sea conveniente. Las analogías de C y Java tienen sentido. Gracias.
Konafa
4

Parece que quiere escribir una nueva biblioteca para que otros la usen, y que le gustaría usar C + 11 como su lenguaje de implementación. Hay una serie de cuestiones a considerar:

  • Al presentar una nueva versión de C ++, presentará la necesidad de implementar las nuevas bibliotecas de tiempo de ejecución de C ++ con su biblioteca, ¿está bien?
  • usted debe no utiliza nuevos C + 11 tipos en su interfaz pública, de lo contrario no será capaz de llamarlo.
  • En general, debe evitar tipos complejos, como unique_ptr, incluso vector, etc. A menos que esté distribuyendo su biblioteca como código fuente, el diseño de los objetos en su biblioteca puede diferir del diseño en el código del cliente. Quédese con los tipos simples que no tienen riesgo de variaciones en el diseño del objeto
Phillip Ngan
fuente