Questa è la prima volta che uso clang
. Quello che mi avvisi è che ogni errore dal clangore riferimento alla libreria std si presenta così:clang sembra utilizzare le librerie gcc
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:245:7:
^^^ ^^^ ^^^
modo che appaia come link clang - o almeno comprende - le librerie GCC.
Il comando che ho utilizzato: clang++ -c -Wall -Wextra -Werror -g test.cpp -o test.o
. (Il programma ha avuto un errore intenzionale solo per dimostrarlo).
Com'è possibile? Cosa posso fare per fare in modo che clang
usi le sue librerie (ma non rompere gcc)?
Ulteriori informazioni:
Sono su un'Ubuntu 14.04 macchina.
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.
avevo precedentemente installato diverse versioni (al tempo stesso, li ha utilizzati con update-alternatives
) di gcc
con apt-get
. In questo momento ho solo 4.8
(ho disinstallato gli altri). Potrei avere incasinato qualcosa allora? Non ho mai installato clang (suppongo che sia predefinito con Ubuntu).
Giusto per chiarire: i programmi corretti vengono compilati ed eseguiti in clang++
.
Ulteriori test: so che gcc
non ha attuato ancora tipi come is_trivially_constructible
e spostare le operazioni sui iostream
nella loro standard di C++ 11 library (https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html) e che ha piena clang C++ 11 library conforme così ho verificato tali compilando clang e ho ottenuto gli errori gcc corrispondenti, il che conferma che clang sta usando le librerie gcc.
Un programma molto semplice
#include <iostream>
using namespace std;
int main() {
cout << "Yada Yada" << endl;
return 0;
}
dà questo errore quando si compila con -std = C++ 1A in 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;
~~^
Così adesso non riesco a compilare nulla con c++1y
in clang.
Non ho potuto installare 'libC++' (alcuni errori sulle dipendenze). Ho installato 'libC++ 1' (che sembra sia la libreria C++ 11 che è ciò che voglio). Quando compilo con '-stdlib = libC++' ottengo 'errore fatale:' iostream 'file non trovato #include '. Se compilo con '-stdlib = libC++ 1' ottengo' clang: error: nome libreria non valido nell'argomento '-stdlib = libC++ 1''. Qualche idea? Grazie. –
bolov
come da questa risposta http://stackoverflow.com/questions/20587228/clang-error-stddef-file-not-found Ho controllato entrambi i simlink e sono entrambi corretti, ma nelle cartelle collegate ci sono alcune intestazioni, ma non le intestazioni standard – bolov
Mi dispiace, non ho molto poco su Ubuntu, ma con Fedora è stato facile creare libC++ dal sorgente. (Anche se ho ottenuto un errore di linker divertente, ma questa è una domanda diversa e ho già risposto su SE). –