Все это похоже на колоссальный беспорядок.
Все, что я хочу, это компилятор, который реализует C ++ 11, поэтому я могу использовать <chrono>
, Но я так растерялся с самого начала.
В настоящее время я создаю программы, вызывая G ++, но когда я проверяю версию через $ g++ -v
, Я получил:
gcc версия 4.2.1 (на основе Apple Inc., сборка 5658) (сборка LLVM
2336.11.00)
В чем дело? Я использую G ++? GCC? LLVM? Я даже не знаю Это одно и то же?
Поэтому сейчас я пытаюсь собрать и загрузить GCC 4.7 через gnu.org, но я понятия не имею, о чем идет речь. Я никогда не видел так много сокращений для вещей, которые я не знаю.
Почему это так сложно? Что со всеми этими версиями, причем некоторые из них реализуют только некоторые части C ++ 11, а не другие?
Вот ситуация на OS X.
Есть два компилятора C ++, установленных по умолчанию.
[5:49pm][wlynch@watermelon ~] g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
[5:49pm][wlynch@watermelon ~] clang++ --version
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
В g ++ выполняется llvm-gcc, который является внешним интерфейсом gcc, а затем внутренним сервером llvm.
Clang ++ выполняет Clang, который является внешним интерфейсом Clang, а затем внутренним интерфейсом llvm.
Если вам нужен компилятор C ++ 11 в OS X без установки других пакетов, единственный вариант — использовать компилятор clang.
Необходимые флаги:
clang++ -stdlib=libc++ -std=gnu++11
Чтобы описать два флага, которые я передаю:
-stdlib=libc++
использует стандартную библиотеку libc ++ вместо gnu libstdc ++. На OS X версия libc ++ имеет поддержку c ++ 11. GNU libstdc ++ один не делает.-std=gnu++11
сообщает компилятору о поддержке функций кода c ++ 11, таких как lambdas и enum class. Вы также можете пройти -std=c++11
, что аналогично, но не включает некоторые обычно ожидаемые расширения GNU. Обновление для OS X 10.9: Начиная с OS X Mavericks, и g ++, и clang ++ фактически используют clang. Разница лишь в том, что g ++ будет подразумевать -stdlib=libstdc++
и clang ++ будет подразумевать -stdlib=libc++
, Итак, на Mavericks, если вы хотите использовать C ++ 11, вы можете следовать приведенному выше совету или просто сделать:
clang++ -std=gnu++11
Обновление для OS X 10.10: Начиная с OS X Yosemite, g ++ все еще замаскирован. Однако ни один из них по умолчанию не использует libstdc ++. Оба сейчас на libc ++.
Похоже, у вас есть Xcode 4.6 и новейшие инструменты командной строки. Это из заметок о выпуске:
Important: The LLVM GCC compiler does not include the latest Objective-C and
C++11 features. Xcode 4.6 is the last major Xcode release which includes the
LLVM GCC compiler and the GDB debugger. Please migrate your projects to use the
LLVM compiler and LLDB debugger…
Я думаю, что вы хотите использовать c++
вместо:
$ c++ -v
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
@sharth: С момента выхода XCode 5.0 ситуация на Mac значительно изменилась. clang / clang ++ являются компиляторами C / C ++ по умолчанию. Я считаю, что они соответствуют LLVM версии 3.3, и эта версия clang ++ полностью C ++ 11-совместимый. Обратите внимание, что clang++ --version
вернет номер версии, такой как «5.0.x» на Mac, но это относится к версии XCode.
Я использую Apple clang ++ в проекте C ++ 11 уже несколько месяцев, и до сих пор я не видел никаких проблем. Нет абсолютно никакой причины использовать любой другой компилятор C ++ на Mac только сейчас 🙂
Ситуация с GCC / G ++ не так радужна. В последней версии G ++ (4.8.2) реализована большая часть стандарта C ++ 11, однако стандартная библиотека не соответствует! Например, std::regex
не реализован в libstdc ++, но вы обнаружите это только тогда, когда вы запускаете свой код и конструкторы регулярных выражений бросают std::regex_error
-s. (Я нашел это нелегким путем, пытаясь перенести вышеупомянутый маленький проект на Linux.) Сообщество верит, что полное соответствие будет достигнуто с выпуском 4.9 G ++. До тех пор вы должны использовать компиляторы Clang и в Linux.
У меня нет доступа к последнему набору компиляторов Intel C ++, поэтому понятия не имею, насколько icpc
является.