2014-06-21 26 views
20

Bu, clang'u ilk kez kullanıyorum. Ne bildirimler std kitaplığı başvuran clang gelen herhangi bir hata şuna benzer olmasıdır: clang gcc kitaplıklarını kullanıyor görünüyor

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:245:7: 
       ^^^     ^^^       ^^^ 

Yani clang bağlantıları gibi görünüyor - ya da en azından içerir - gcc kütüphaneler.

Kullandığım komut: clang++ -c -Wall -Wextra -Werror -g test.cpp -o test.o. (Programın bunu kanıtlamak için kasıtlı bir hatası vardı).

Bu nasıl olabilir? clang'un kendi kitaplıklarını kullanmak için ne yapabilirim (gcc'yi değil)?


ek bilgiler:

Ben Ubuntu 14.04 makinede duyuyorum.

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. 

Daha önce farklı versiyonlarını yüklü vardı apt-get ile gcc arasında (aynı anda, update-alternatives onlara kullanılır). Şu anda sadece 4.8 (diğerlerini kaldırdım) var. O zaman bir şeyleri mahvedebilir miyim? Ben asla clang yüklemedim (sanırım Ubuntu ile varsayılan).

Açıklamak gerekirse: doğru programlar derlenip çalıştırılır. clang++.

ilave testler: Ben gcc tip is_trivially_constructible gibi henüz uygulamaya ve kendi standart C++ 11 kütüphanesinden (https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html) içinde iostream işlemleri kıpırdamadı olduğunu biliyoruz ve o çınlama tam c sahiptir ++ 11 uyumlu kütüphanesi yüzden bu test clang ile derlemek ve sadece glangin gcc kütüphanelerini kullandigini onaylayan gcc hatalarini aldim. Ben de c++1y ile bir şey derleme olamaz Yani şu anda

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; 
     ~~^ 

:

Çok temel program

#include <iostream> 
using namespace std; 

int main() { 
    cout << "Yada Yada" << endl; 
    return 0; 
} 

++ clang içinde -std = C++ 1y ile derleme bu hatayı veriyor clang.

cevap

20

Sen libc++ yükleyip ben benzer bir sorunu vardı clang -stdlib=libc++

+0

'libC++' yükleyemiyorum (bağımlılıklar ile ilgili bazı hatalar). 'LibC++ 1' yi kurdum (bu benim istediğim C++ 11 kütüphanesi gibi görünüyor). "-stdlib = libC++" ile derlediğimde "önemli hata" alıyorum: "iostream" dosyası bulunamadı ['. '-stdlib = libC++ 1 ile derlerim:' clang: error: argümanında geçersiz kütüphane adı '-stdlib = libC++ 1'. Herhangi bir fikir? Teşekkür ederim. Bu cevaba göre – bolov

+0

http://stackoverflow.com/questions/20587228/clang-error-stddef-file-not-found Her iki simlinks'i de kontrol ettim ve her ikisi de doğru, ancak bağlantılı klasörlerde birkaç başlık var. ama standart başlıklar değil – bolov

+0

Üzgünüm, Ubuntu hakkında fazla bir şey yok, ama Fedora altında libC++ 'yi kaynaktan oluşturmak çok kolaydı. (Komik bir bağlayıcı hatası aldım, ancak bu farklı bir soru ve zaten SE'de cevaplandırıldı). –

9

ile kullanmak yapmak gerekir: bu yüzden zaman clang derlemek zaten benim Linux Mint (Ubuntu baz) üzerine kuruldu (g ++) GCC, bir "hata başlamıştı : "gets" ifadesini kullanarak global ad alanında 'üye' adlı bir üye yok. libC++ yükleyerek giderilir

- ++ dev (sudo apt-get install libc++-dev) ve -stdlib ile derleme (clang++ -g -std=c++1y -stdlib=libc++ helloworld.cpp -o helloworld)

0

Gerçek sorun gayri adı başvurmak için kullanıldı C++ 14 (C++ 1y kullandığınız olmasıdır GCC 4.8'e ait bir C++ kütüphanesi ile, henüz tam olarak oluşmadığı zamana). GCC 4.8 tamamen C++ 11 desteğine sahiptir, ancak C++ 14 özelliklerinde bile zorlukla başlamıştır.

Bu C++ 14 std::gets kaldırarak neden olur ve GNU C C++ kütüphanesi henüz yakalanmış değil iken genel ad gets tanımlayarak vermeyerek bu konuda tahmin kütüphane ve std içinde kullanılabilir hale getirmek için çalışıyor ad.

Bunu çözmenin uygun yolu, C++ 14 desteğiyle bir C++ kitaplığı kullanmak için libC++ kullanılmasını gerektirmez. GLIBCXX 4.9 (libstdC++) zaten yeterlidir.

+0

bu gerçek bir problem değildir. Libstd ++ 've' libC++ 'nin C++ 11/C++ 14 standardı için uygulama aşamasında farklı olduğunu biliyordum ve bu bilgiyi sadece hangi kütüphanenin kullanıldığı ispatlamak için kullandım. – bolov

+0

GCC 4.9.4'ün libstdC++ dosyasını kullanarak C++ 3.8 modunda C++ 14 modunda oluşturmaya çalışırken aynı GCC sürümüyle (4.8.2) bu tam hata mesajını aldım. – Giel

+0

tekrar: Bu soru hataları düzeltmekle ilgili değil. Sorgumdan "İleri testler" ile başlayan paragrafı okuyun. – bolov