c++ - con - compilar hilos en c linux
clang parece utilizar las bibliotecas gcc (3)
Esta es la primera vez que uso clang
. Lo que noté es que cualquier error de clang que hace referencia a la biblioteca estándar se ve así:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:245:7:
^^^ ^^^ ^^^
Así que parece que los enlaces de Clang, o al menos incluyen, las bibliotecas gcc.
El comando que utilicé: clang++ -c -Wall -Wextra -Werror -g test.cpp -o test.o
(El programa tuvo un error intencional solo para probar esto).
¿Cómo es esto posible? ¿Qué puedo hacer para hacer que clang
use sus propias bibliotecas (pero no para romper gcc)?
Información Adicional:
Estoy en una máquina Ubuntu 14.04.
clang++ --version
Ubuntu clang version 3.5-1ubuntu1 (trunk) (based on LLVM 3.5)
Target: x86_64-pc-linux-gnu
Thread model: posix
g++ --version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
Anteriormente había instalado varias versiones (al mismo tiempo, las había utilizado con update-alternatives
) de gcc
con apt-get
. Ahora mismo solo tengo 4.8
(he desinstalado los demás). ¿Podría haber arruinado algo entonces? Nunca he instalado el clang (supongo que es predeterminado con Ubuntu).
Solo para aclarar: los programas correctos se compilan y ejecutan en clang++
.
Pruebas adicionales: Sé que gcc
aún no implementó tipos como is_trivially_constructible
y movió las operaciones en iostream
en su biblioteca estándar de c ++ 11 ( https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html ) y ese clang tiene una biblioteca completa que cumple con c ++ 11, así que probé los compiladores con clang y obtuve los errores gcc correspondientes, lo que solo confirma que clang está usando las bibliotecas gcc.
Un programa muy básico.
#include <iostream>
using namespace std;
int main() {
cout << "Yada Yada" << endl;
return 0;
}
da este error al compilar con -std = c ++ 1y en clang ++:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/iostream:39:
...
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:120:11: error: no member named ''gets'' in the global namespace
using ::gets;
~~^
Así que ahora mismo no puedo compilar nada con c++1y
en clang.
Necesitas instalar libc++
y hacer que -stdlib=libc++
lo use con -stdlib=libc++
Su problema real es que está utilizando C ++ 14 (c ++ 1y era el nombre informal que se usaba para referirse a él cuando aún no estaba completamente formado), con una biblioteca de C ++ que pertenece a GCC 4.8. GCC 4.8 tiene soporte completo para C ++ 11, pero apenas comienza con las características de C ++ 14.
Esto se debe a que C ++ 14 elimina std::gets
, y la biblioteca GNU C anticipa que no definirá las gets
en el espacio de nombres global mientras que la biblioteca C ++ aún no se ha puesto al día y está tratando de hacer que esté disponible en el std
nombres std
.
La forma correcta de resolver esto no requiere el uso de libc ++, solo usar una biblioteca de C ++ con soporte de C ++ 14. GLIBCXX 4.9 (también conocido como libstdc ++) ya es suficiente.
Tuve un problema similar: GCC (g ++) ya estaba instalado en mi LinuxMint (base de Ubuntu), de modo que al compilar con el clang, se estaba obteniendo un "error: ningún miembro llamado ''gets'' en el espacio de nombres global usando :: gets".
resuelto instalando libc ++ - dev ( sudo apt-get install libc++-dev
) y compilando con -stdlib ++ ( clang++ -g -std=c++1y -stdlib=libc++ helloworld.cpp -o helloworld
)