2011-06-27 12 views
12

Estoy escribiendo una biblioteca que debe depender de las bibliotecas que no están compilando actualmente con soporte para el nuevo estándar. Me gustaría compilar una biblioteca que debe depender de esas bibliotecas con std = C++ 0x. ¿Hay algún problema al hacer esto?Cualquier problema con la mezcla de bibliotecas con y sin std = C++ 0x

+1

encabezados pueden ser un problema, consulte aquí: http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html –

Respuesta

11

Si mezcla bibliotecas compiladas con diferentes opciones de compilación, entonces debe asegurarse de que el ABI para los tipos de datos en la interfaz sea el mismo. Algunos tipos de datos (como std::string) tienen diferentes interfaces y requisitos entre C++ 03 y C++ 0x, por lo que las interfaces que los utilizan deben ser cuidadosas.

Si sus interfaces solo usan tipos incorporados y sus propias clases, y éstas no usan ninguna clase de biblioteca estándar, entonces todas deberían estar bien. De lo contrario, deberá verificar el subconjunto específico que está utilizando.

+1

Solo usar C en la interfaz no es suficiente en general. No funciona cuando se vinculan estáticamente, bajo Unix, se requieren opciones especiales para 'dlopen' cuando se vinculan dinámicamente, y en Windows, hubo un error en la biblioteca atrapado por/MD o/MDd, lo que significaba que fallaría si cualquiera de las bibliotecas usó 'std :: string' y se compilaron con diferentes opciones. (He oído que este error se ha solucionado en VC10). –

+0

@James: estoy de acuerdo en general, pero este problema está etiquetado ** gcc **. Según tengo entendido, la intención de los desarrolladores de la biblioteca gcc es que, siempre que sea posible, se pueda usar el código '-std = C++ 98' y' -std = C++ 0x' en el mismo programa, siempre que el la interfaz entre estos bits de código solo usa tipos compatibles. p.ej. en Linux solo hay un binario 'libstdC++. so', usado por ambos códigos' -std = C++ 98' y '-std = C++ 0x'. –

+0

Existe la intención de los desarrolladores, y está lo que realmente sucede. He tenido problemas para que 'dynamic_cast' funcione cuando se ejecutó en un' .so', y el objeto se construyó en otro. Y con las opciones de 'dlopen' necesarias para que' dynamic_cast' funcione, terminará compartiendo algunas de las otras funciones, incluidas las funciones miembro de 'std :: vector', etc. Y el tamaño y el diseño de' std: : vector' depende de las opciones del compilador; ni siquiera tiene que cambiar las versiones para que falle. –

3

La respuesta simple es no, a menos que el vendedor lo garantice explícitamente (y aun así). En términos prácticos, todos los códigos vinculados deben usar la misma biblioteca estándar y compilarse con la misma versión del compilador, utilizando las mismas opciones. Hay formas de evitar esto, al menos para las bibliotecas vinculadas dinámicamente, pero solo funcionan si la interfaz entre las bibliotecas es pura C, y se toman medidas especiales al vincular (opciones especiales con dlopen --- ninguna biblioteca usa std::string en VC++ pre versión 10, etc.). De lo contrario, estás buscando problemas.

Cuestiones relacionadas