2012-01-25 2 views
9

После значительных усилий, получающих clang и libC++ для компиляции, запуска, интеграции с NetBeans и даже кросс-компиляции на 32-битную машину, я думал, что все это выяснилось! Поэтому я перехожу к использованию некоторых функций, которые у libstdC++ не было (вся причина для перевертывания моей рабочей среды dev) и обнаружить ... Я не могу этого сделать.libC++ - остановить std переименовать в std :: __ 1?

libC++ установлен, он работает, и скомпилированная программа (когда она работает) действительно требует этого. Тем не менее, компилятор по-прежнему пытается использовать версии libstdC++ при каждой возможности, возиться с пространством имен; std::__1::map, std::__1::basic_string, и так далее. Теперь я знаю от this question, почему это происходит, и почему это делает libC++. Мне просто нужно знать, как обрезать, потому что это совершенно неприменимо - я действительно действительно хочу использовать версии libC++, и в моем коде нет ничего, что требовало бы сосуществования двух типов.

Я попытался взять папки libstdC++ из пути include и, в противном случае, сделал их полностью недоступными. Не повезло. Я не использую никаких дополнительных библиотек, только встроенные заголовки Linux/POSIX (errno, socket, syslog, fcntl).

EDIT: Сообщение об ошибке: Карта

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++ не устанавливать(). Версия libC++ делает.

Следующая вызов, из командной строки, кажется, работает:

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

призыванием внутри NetBeans не:

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

Фактически, 'std :: __ 1 :: map' находится в' libC++ '* not * в' libstdC++'. Не могли бы вы показать нам сообщение об ошибке? –

+0

Я добавил ошибку в сообщение. Версия libC++ на карте имеет emplace(), но libstdC++ (попытка получить доступ через версию std :: __ 1 :: map) не работает. – DigitalMan

+0

Не могли бы вы также использовать свою командную строку, чтобы проверить правильность настроек? (например, stdlib, например: «clang ++ -stdlib = libC++») –

ответ

2

Из комментариев:

araqnid: В вашем вызове NetBeans нет -std=c++0x, разве это не нужно? std::map::emplace - это метод C++ 11.

DigitalMan (OP): @araqnid Это на самом деле! Клэнг жаловался на то, что этот аргумент не используется, и по-прежнему, по сути, даже когда он используется и требуется, поэтому я взял его из конфигурации NetBeans. Конечно, ошибочное предупреждение лучше полной ошибки.