2014-06-21 13 views
20

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.

risposta

20

È necessario installare libc++ e rendere clang usarlo con -stdlib=libc++

+0

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

+0

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

+0

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). –

9

ho avuto problema simile: GCC (g ++) già è stato installato sul mio LinuxMint (base Ubuntu) in modo che quando la compilazione con clangore, è stato sempre un "errore : nessun membro chiamato 'ottiene' nel namespace globale usando :: gets ".

risolto installando libC++ - dev (sudo apt-get install libc++-dev) e la compilazione con -stdlib ++ (clang++ -g -std=c++1y -stdlib=libc++ helloworld.cpp -o helloworld)

0

Il vostro vero problema è che si sta utilizzando C++ 14 (++ 1A c era il nome informale usato per riferirsi ad esso quando non era ancora completamente formato), con una libreria C++ che appartiene a GCC 4.8. GCC 4.8 ha un supporto completo per C++ 11, ma non ha nemmeno iniziato con le funzionalità di C++ 14.

Questo è causato da C++ 14 rimozione std::gets, e la libreria GNU C anticipando il che non definendo gets nel namespace globale, mentre la libreria C++ non ha ancora raggiunto e sta cercando di renderlo disponibile in std namespace.

Il modo corretto per risolvere questo problema non richiede l'utilizzo di libC++, solo per utilizzare una libreria C++ con supporto C++ 14. GLIBCXX 4.9 (noto anche come libstdC++) è già sufficiente.

+0

questo non è il vero problema. Sapevo che 'libstd ++' e 'libC++' differivano nello stadio di implementazione per lo standard C++ 11/C++ 14 e ho semplicemente usato questa conoscenza per provare quale libreria era usata. – bolov

+0

Ho ottenuto questo esatto messaggio di errore con la stessa versione GCC (4.8.2) quando si tenta di costruire in modalità C++ 14 con Clang 3.8, usando libstdC++ di GCC 4.9.4 lo corregge. – Giel

+0

di nuovo: questa domanda non riguarda la correzione degli errori. Leggi il paragrafo che inizia con "Ulteriori test" dalla mia domanda. – bolov

Problemi correlati