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
Respuesta
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.
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). –
@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'. –
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. –
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.
- 1. Problema con std :: make_tuple en C++ 0x
- 2. Problema con std :: mapa y std :: par
- 3. Mezcla de bibliotecas estáticas y bibliotecas compartidas
- 4. compatibilidad con especificaciones g ++ y C++ 0x
- 5. Mezcla C y C++ con CMAKE
- 6. Cómo utilizar autoconf con C++ 0x cuenta
- 7. C++ 0x con Qt Creator
- 8. strdup error en g ++ con C++ 0x
- 9. Mezcla C# con Objective-C
- 10. C++ fábrica de la clase 0x con problema de plantillas variadic
- 11. Usando código C++ nativo en C# - problema con std :: vector
- 12. _stricmp con mingw y C++ 0x no existe?
- 13. ¿Debería std :: sort funcionar con la función lambda en C++ 0x/C++ 11?
- 14. Mezcla de ABI de C++ para compilar contra bibliotecas heredadas
- 15. std :: transformar utilizando C++ 0x expresión lambda
- 16. CMake clang y C++ 0x
- 17. Vincular bibliotecas con dependencias en Visual C++ sin obtener LNK4006
- 18. ¿Qué bibliotecas necesito para usar std :: placeholders?
- 19. std :: excepción futura en gcc implementación experimental de C++ 0x
- 20. Plantillas, punteros de función y C++ 0x
- 21. C++ 0x std :: función como argumento de un método
- 22. Cualquier problema de navegador cruzado con document.documentElement
- 23. Cómo empaquetar C++ con DLL y bibliotecas
- 24. C++ 0x compila pero eclipse errores de editor incluso con -gnu ++ 0x descubrimiento
- 25. Problema de mezcla OpenGL
- 26. Cualquier experiencia con C# y ZeroC ICE
- 27. C++ 0x lambdas con parámetros de plantilla?
- 28. ¿Boost.Tuple es compatible con las plantillas variadic de C++ 0x?
- 29. Mezcla de Objective-C y C++
- 30. puntero sin formato C++ y std :: shared_ptr
encabezados pueden ser un problema, consulte aquí: http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html –