¿Cuándo es necesario utilizar use the flag-stdlib = libstdc++?


¿Cuándo es necesario usar el flag -stdlib=libstdc++ para el compilador y el enlazador cuando se compila con gcc?

¿El compilador utiliza automáticamente libstdc++?

Estoy usando gcc4.8.2 en Ubuntu 13.10 y me gustaría usar el estándar c++11. Ya le paso -std=c++11 al compilador.

Author: Raymond Valdes, 2013-11-04

3 answers

En Linux: En general, todas las distribuciones de linux comúnmente disponibles usarán libstdc++ por defecto, y todas las versiones modernas de GCC vienen con un libstdc++ que soporta C++11. Si desea compilar el código de c++11 aquí, use uno de los siguientes:

  • g++ -std=c++11 input.cxx -o a.out
  • g++ -std=gnu++11 input.cxx -o a.out

En OS X antes de Mavericks: g++ era en realidad un alias para clang++ y la versión antigua de Apple de libstdc++ era la predeterminada. Podría utilizar libc++ (que incluía soporte para la biblioteca c++11) por pasando -stdlib=libc++. Si desea compilar el código de c++11 aquí, use uno de los siguientes:

  • g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out

En OS X desde Mavericks: libc++ es el valor predeterminado. Puede usar la versión antigua de libstdc++ de Apple (que no incluye soporte para la biblioteca c++11) pasando -stdlib=libstdc++

  • clang++ -std=c++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out
 70
Author: Bill Lynch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-18 09:16:51

¿Cuándo es necesario usar el flag -stdlib=libstdc++ para el compilador y el enlazador cuando se compila con gcc?

Respuesta corta: nunca

Respuesta más larga: -stdlib es un indicador de Clang y no funcionará con ninguna versión de GCC jamás lanzada. En Mac OS X a veces los comandos gcc y g++ son en realidad alias para Clang no GCC, y la versión de libstdc++ que Apple envía es ancient (circa 2008) así que, por supuesto, no soporta C++11. Esto significa que en OS X al usar Clang-pretending-to-be-GCC, puede usar -stdlib=libc++ para seleccionar la nueva biblioteca compatible con C++11 de Clang, o puede usar -stdlib=libstdc++ para seleccionar la versión antigua pre-C++11 de libstdc++ que pertenece a un museo. Pero en GNU / Linux gcc y g++ realmente GCC no Clang, por lo que la opción -stdlib no funcionará en absoluto.

¿El compilador utiliza automáticamente libstdc++?

Sí, GCC siempre usa libstdc++ a menos que le diga que use no biblioteca estándar en absoluto con la opción -nostdlib (en cuyo caso debe evitar usar cualquier característica de biblioteca estándar, o usar banderas -I y -L y -l para apuntar a un conjunto alternativo de archivos de cabecera y biblioteca).

Estoy usando gcc4.8.2 en Ubuntu 13.10 y me gustaría usar el estándar c++11. Ya le paso -std=c++11 al compilador.

No necesitas hacer nada más. GCC viene con su propia implementación de la biblioteca estándar C++ (libstdc++) que se desarrolla y prueba junto con el propio GCC, por lo que la versión de GCC y la versión de libstdc++ son 100% compatibles. Si compila con -std=c++11 entonces eso habilita las características de C++11 en el compilador g++ y también las características de C++11 en las cabeceras de libstdc++.

 8
Author: Jonathan Wakely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-18 09:09:20

El compilador usa el libstdc++ automáticamente, si usa el frontend de g++, no el frontend de gcc.

 6
Author: Torsten Robitzki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-04 18:46:00