2012-04-04 9 views
9

Estoy desarrollando una aplicación en C++ 11, usando g ++ - 4.7 y -std = C++ 0x.
Mi aplicación está vinculada a una biblioteca compartida compilada con g ++ - 4.7, pero sin la directiva -std = C++ 0x.Compatibilidad de biblioteca entre C++ 11 y C++ 03

Lamentablemente, nada funciona, lo que significa que tengo un comportamiento extraño cuando uso las clases y los métodos de la biblioteca externa. (Por supuesto, compilar mi aplicación sin -std = C++ 0x funciona bien).

  1. ¿Es esto un comportamiento esperado o es un error del compilador?

  2. Cualquier solución (algo así como la palabra clave extern C)?

+1

¿Por qué no puedes recompilar la biblioteca con '-std = C++ 0x'? – leftaroundabout

+4

Es claramente una violación del requisito de que todas las unidades de traducción vean el mismo código si compila una TU con una vista de los encabezados de la biblioteca y otra TU con una vista diferente. –

+1

Compilar con diferentes banderas es uno de los caminos más cortos hacia la locura. Está más o menos bien para advertencias y niveles de optimización, pero cuando afecta la interpretación del código fuente o el diseño de los binarios producidos ... zumbido. –

Respuesta

10

La librería estándar ha cambiado, y la bandera -std=c++0x compilador determinar qué parte de la biblioteca está en uso. Al intentar usar ambas versiones en el mismo programa, está quebrando la regla de una definición (para cada elemento utilizado en la biblioteca estándar, tiene dos definiciones para el mismo identificador).

No creo que haya nada simple que pueda hacerse para superar esta limitación. Debería asegurarse de usar solo una versión de la biblioteca (es decir, definir las macros apropiadas antes de incluir encabezados estándar para deshabilitar C++ 11 dentro de esas bibliotecas), y aun así no estoy seguro de que el código generado todavía no esté disponible. romper el ODR (si las extensiones C++ 11 compilan el código de la biblioteca C++ 03 de forma diferente).

Cuestiones relacionadas