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

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

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

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


Что происходит? Я использую G++? ССЗ? ЛЛВМ? Я даже не знаю. Это одно и то же?


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

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


person gone    schedule 01.02.2013    source источник
comment
Похоже, вы на Mac. Вы можете использовать MacPorts для установки современной версии GCC. Компиляция GCC из исходного кода немного сложна, поэтому я думаю, вам понадобятся MacPorts.   -  person Seth Carnegie    schedule 02.02.2013
comment
@SethCarnegie спасибо! Раньше я нажимал и устанавливал. Теперь для установки чего-либо требуется следующая книга команд командной строки. Как что.   -  person gone    schedule 02.02.2013
comment
Прочтите этот раздел руководства, и вы сможете выполнить sudo port install gcc47 после установки MacPorts, и у вас будет найти команду для использования g++ 4.7 (не помню). Кроме того, я думаю, что Mac поставляются с установленным современным Clang.   -  person Seth Carnegie    schedule 02.02.2013
comment
@SethCarnegie да, но при компиляции с clang я получаю fatal error: 'chrono' file not found   -  person gone    schedule 02.02.2013
comment
Да, вы должны сказать ему, где находится ваша стандартная библиотека и прочее или что-то в этом роде, чего я не знаю, как сделать. Вы можете проверить, как XCode вызывает это через параметры или что-то в этом роде. Но я избегаю всего этого и просто устанавливаю GCC с помощью той команды, которую я вам показал.   -  person Seth Carnegie    schedule 02.02.2013
comment
Вместо этого вы всегда можете просто использовать Boost.Chrono...   -  person ildjarn    schedule 07.02.2013


Ответы (3)


Вот ситуация на 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 указывает компилятору поддерживать функции кода С++ 11, такие как лямбда-выражения и класс enum. Вы также можете передать -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++ по-прежнему скрыто. Однако ни один из них больше не использует libstdc++ по умолчанию. Оба сейчас на libc++.

person Bill Lynch    schedule 01.02.2013
comment
ржу не могу. Спасибо!! Так запутанно, спасибо за ваше объяснение! Таким образом, серверная часть llvm выполняет фактическую компиляцию независимо от того, а gcc/clang выполняет синтаксический анализ? поэтому -stdlib=libc++ сообщает компилятору, где найти нужные мне библиотеки, а '-std=gnu++11' сообщает компилятору, какой версии следовать? Почему gnu вообще участвует во всем этом? - person gone; 02.02.2013
comment
Это сообщение отвечает на различия между -std=gnu++11 и -std=c++11. Короткий ответ заключается в том, что в gcc описаны некоторые расширения C++, которые часто желательны. Clang опционально реализует их. - person Bill Lynch; 02.02.2013
comment
Вы также правы в своем утверждении, что бэкэнд LLVM фактически выполняет компиляцию независимо от того, а затем gcc или clang выполняет синтаксический анализ. - person Bill Lynch; 02.02.2013
comment
Последнее, что следует отметить, это то, что GCC и libstdc++ поддерживают C++11. Однако Apple включает только более старые версии программного обеспечения (которые его не поддерживают) из-за опасений по поводу лицензирования (GPLv3). - person Bill Lynch; 02.02.2013

Похоже, у вас есть 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
person eager    schedule 01.02.2013
comment
Спасибо за ответ. что такое c++?? Чувак, я так запутался. Все ли эти компиляторы одинаковы? Разные? Типа разные? - person gone; 02.02.2013
comment
@ZacharyO'Keefe c++ — это псевдоним clang++. - person Seth Carnegie; 02.02.2013
comment
@SethCarnegie clang++ отличается от clang? Мужчина. ржу не могу. что такое llvm-gcc? это ллвм? gcc? - person gone; 02.02.2013
comment
clang++ относится к clang, как g++ к gcc; один для C++, другой для C. llvm-gcc — это версия GCC, предназначенная для LLVM для генерации кода. - person Seth Carnegie; 02.02.2013

@sharth: ситуация на Mac значительно изменилась после выпуска XCode 5.0. 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.

person Laryx Decidua    schedule 30.01.2014