Получение С++ 11-совместимого компилятора

Все это похоже на колоссальный беспорядок.
Все, что я хочу, это компилятор, который реализует С++ 11, поэтому я могу использовать <chrono>. Но я смущен с самого начала.

В настоящее время я создаю программы, вызывая g++, но когда я проверяю версию с помощью $ g++ -v, я получаю:

gcc версия 4.2.1 (на основе Apple Inc. build 5658) (сборка LLVM 2336.11.00)


Что происходит? Я использую g++? GCC? LLVM? Я даже не знаю. Они одно и то же?


Итак, теперь я пытаюсь создать и загрузить GCC 4.7 через gnu.org, но я понятия не имею, о чем говорит какой-либо из руководств. Я никогда не видел столько акронимов для вещей, которые я не знаю.

Почему это так сложно? Что со всеми этими версиями, причем некоторые из них реализуют только некоторые части С++ 11, а не другие?

Ответ 1

Здесь ситуация на OS X.

По умолчанию установлены два компилятора С++.

[5:49pm][[email protected] ~] 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][[email protected] ~] 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.

Если вы хотите компилятор С++ 11 на OS X без установки других пакетов, единственным вариантом является использование компилятора clang.

Необходимыми флагами являются:

clang++ -stdlib=libc++ -std=gnu++11

Чтобы описать два флага, которые я передаю:

  • -stdlib=libc++ использует стандартную библиотеку libС++ вместо gnu libstdС++. В OS X версия libС++ поддерживает С++ 11. В gnu libstdС++ этого нет.
  • -std=gnu++11 сообщает компилятору о поддержке функций кода С++ 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, если вы хотите использовать С++ 11, вы можете следовать приведенному выше совету или просто:

clang++ -std=gnu++11

Обновление для OS X 10.10. Что касается OS X Yosemite, g++ все еще скрывается. Однако ни один из них не использует libstdС++ по умолчанию. Оба теперь находятся на libС++.

Ответ 2

Похоже, у вас есть 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

Ответ 3

@sharth: ситуация значительно изменилась на Mac с момента выпуска XCode 5.0. clang/clang++ - это компиляторы C/С++ по умолчанию. Они соответствуют версии LLVM 3.3. Я полагаю, и эта версия clang++ полностью совместима с С++ 11. Обратите внимание, что clang++ --version вернет номер версии, такой как "5.0.x" на Mac, но это относится к версии XCode.

Я использую Apple clang++ в проекте С++ 11 уже несколько месяцев, и до сих пор я не видел никаких проблем. Нет абсолютно никакой причины использовать какой-либо другой компилятор С++ на Mac только сейчас: -)

Ситуация с GCC/g++ не такая радужная. Последняя версия g++ (4.8.2) действительно реализует большинство стандартов С++ 11, однако стандартная библиотека не соответствует требованиям! Например, std::regex не реализован в libstdС++, но вы обнаружите это только тогда, когда вы запускаете свой код и конструкторы регулярных выражений бросаете std::regex_error -s. (Я нашел это трудным путем, пытаясь перенести вышеупомянутый маленький проект в Linux.) Сообщество полагает, что полное соответствие будет достигнуто с выпуском версии G + версии 4.9. До тех пор вы также должны использовать компиляторы Clang на Linux.

У меня нет доступа к последнему набору компиляторов Intel С++, поэтому не знаю, насколько совместим icpc.