2012-01-25 15 views
9

Po znacznym wysiłku, uzyskanie clang i libC++ do kompilacji, uruchomienia, integracji z NetBeans, a nawet cross-kompilacji do maszyny 32-bitowej, myślałem, że to wszystko wymyśliłem! Więc używam niektórych funkcji, których nie zawiera libstdC++ (cały powód, dla którego zmieniłem moje środowisko programisty do góry nogami) i odkryłem ... Nie mogę tego zrobić.libC++ - stop std zmienia nazwę na std :: __ 1?

libC++ jest zainstalowany, działa, a skompilowany program (jeśli to działa) tego wymaga. Jednak kompilator wciąż próbuje użyć wersji libstdC++ przy każdej okazji, poprzez komunikację z przestrzenią nazw; std::__1::map, std::__1::basic_string i tak dalej. Teraz wiem od this question, dlaczego tak się dzieje i dlaczego robi to libC++. Po prostu muszę się dowiedzieć, jak zniszczyć to, ponieważ jest całkowicie nie do zastosowania - naprawdę, naprawdę chcę używać wersji libC++, i nie ma w moim kodzie nic, co wymagałoby współistnienia dwóch typów.

Próbowałem już zabrać ze sobą foldery libstdC++ ze ścieżki dołączania, a w przeciwnym razie całkowicie uniemożliwić ich dostęp. Brak szczęścia. Nie używam żadnych dodatków do bibliotek, tylko wbudowane nagłówki Linux/POSIX (errno, socket, syslog, fcntl).

EDIT: Komunikat o błędzie:

CoreCache.cpp:61:12: error: no member named 'emplace' in 'std::__1::map<std::__1::basic_string<char>, CacheEntry, std::__1::less<std::__1::basic_string<char> >, std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>, CacheEntry> > >' 

libstdC++ map nie posiada emplace(). Wersja libC++ ma.

co następuje wywołanie z linii poleceń, wydaje się działać:

clang++ -o stachecache -I /usr/local/lib/clang/3.1/include/ -I /usr/include/c++/v1/ -std=c++0x -stdlib=libc++ ./*.cpp 

wezwaniem od wewnątrz NetBeans nie:

clang++ -stdlib=libc++ -O3 -c -O3 -Werror -MMD -MP -MF build/Release/clang-Linux-x86/CoreCache.o.d -o build/Release/clang-Linux-x86/CoreCache.o CoreCache.cpp 
+3

Właściwie, 'std :: __ 1 :: map' jest w' libC++ '* not * w' libstdC++ '. Czy możesz pokazać nam komunikat o błędzie? –

+0

Dodałem błąd do wpisu. Wersja mapy z libC++ ma wersję emplace(), ale wersja libstdC++ (próba dostępu przez std :: __ 1 :: map) nie działa. – DigitalMan

+0

Mógłbyś również użyć linii poleceń, aby sprawdzić, czy podajesz prawidłowe opcje? (np. stdlib na przykład: "clang ++ -stdlib = libC++") –

Odpowiedz

2

Z uwag:

araqnid: Wywołanie NetBeans nie ma -std=c++0x, czy to nie jest potrzebne? std::map::emplace to metoda C++ 11.

DigitalMan (OP): @araqnid To faktycznie to zrobiło! Clang narzekał na to, że ten argument jest nieużywany - i nadal jest, nawet jeśli jest używany i wymagany - więc wyjąłem go z konfiguracji NetBeans. Błędne ostrzeżenie jest lepsze niż całkowity błąd, z pewnością.

Powiązane problemy