2011-05-14 11 views
5

Al compilar un proyecto de OCaml que une contra las librerías que requieren biblioteca estándar de C++ (por ejemplo, enlaces de OCaml de LLVM) usando el argumento -cc g++-ocamlc con GCC> = 4.4 genera la advertencia extremadamente verboso expulsan de la forma:¿Cómo puedo suprimir las advertencias de obsolescencia de g ++ en la compilación OCaml cuando se enlazan con bibliotecas C++?

warning: deprecated conversion from string constant to ‘char*’ 

Cómo ¿es posible eliminar estas advertencias?

Respuesta

6

El problema proviene de ocamlc generar el código intermedio C que desencadena advertencias cuando se compila en modo C++ por las versiones más nuevas de GCC. Pero este código generado no necesita ser compilado como C++. La única razón para pasar -cc g++ para este caso común de compilación contra una biblioteca envuelta de C++ es garantizar que se construyan las dependencias de la biblioteca estándar de C++. La solución más simple, que evita el uso de la ++ front-end C para compilar el código intermedio ocamlc, es simplemente:

-cclib -lstdc++ 

que las fuerzas que une el código C generado con libstdc++, mientras que todavía la compilación en el modo C llanura.

+0

afaik es mejor compilar el código ocamlc con el compilador c y usar '-cc g ++' cuando se vincula (-lstdC++ puede no ser suficiente) – ygrek

+0

Punto justo, aunque esto funciona en todos los entornos que he probado. (g ++ generalmente es solo un contenedor que configura el entorno de la cadena de herramientas de GCC para hacer cosas como -lstdC++.) ¿Alguna idea de cómo forzar -cc g ++ a pasar solo como un argumento de enlazador cuando se usa OCamlBuild? – jrk

+1

'flag [" ocaml ";" link ";" native "] & atomize [" -cc ";" g ++ "]' debería funcionar – ygrek

2

Creo que sólo puede hacer

#pragma GCC diagnostic ignored "-Wwrite-strings" 

En el C++ para suprimir esto.

+0

Esto evita el problema subyacente en lugar de resolverlo. El problema más profundo era la biblioteca estándar de OCaml que usaba C, que no era compatible con C++. Las fuentes en cuestión no son propiedad del usuario, sino del sistema subyacente, por lo que modificarlas para agregar pragmas de supresión de advertencias no es práctico. – jrk

Cuestiones relacionadas