В чем разница? лязг++ | лязг -std = С++ 11

Я ошибочно использовал эту команду, которая не удалась на этапе ссылки:

$ clang -std=c++11 -stdlib=libc++ myInputFile.cpp

Кто-нибудь может объяснить, почему clang предоставляет параметр языка C++ и почему он не может связать? Почему параметры -x c++ или -std=c++11 не выполняют то же самое, что и clang++? Спасибо!


person djwbrown    schedule 18.11.2013    source источник
comment
Что случилось с минусами? Да, я понимаю, что clang++ — это просто ссылка для настройки clang для C++. Это не мой вопрос, пожалуйста, посмотрите еще раз. Если это настолько просто, пожалуйста, просто ответьте, а не минусуйте.   -  person djwbrown    schedule 18.11.2013
comment
Этот вопрос в его 4-й редакции является совершенно правильным вопросом, и я не вижу причин голосовать за его закрытие или отрицание. Это «Почему…?» вопрос, но его масштабы достаточно малы, чтобы можно было надеяться, что в качестве ответа будет предложено общепринятое обоснование.   -  person Pascal Cuoq    schedule 18.11.2013
comment
Должно ли std=c++11 stdlib=libc++ в вопросе быть -std=c++11 -stdlib=libc++?   -  person Eric Postpischil    schedule 18.11.2013
comment
Какое сообщение об ошибке вы получаете при попытке установить ссылку? Вы связываетесь с командой в вопросе или с другой командой?   -  person Eric Postpischil    schedule 18.11.2013
comment
@EricPostpischil Вы правы; это то, что я получаю за то, что не копирую/вставляю. Я отредактировал вопрос в последний раз, чтобы отразить это.   -  person djwbrown    schedule 19.11.2013


Ответы (2)


Технически ни одна из программ с именами clang или clang++ не является компилятором: обе они являются драйверами, которые анализируют входные аргументы и определяют, какие компиляторы/ассемблеры/компоновщики вызывать для каких файлов с какими аргументами командной строки. Единственная разница между ними заключается в том, что clang ссылается только на стандартную библиотеку C, если она выполняет ссылку, тогда как clang++ ссылается как на стандартные библиотеки C++, так и на C.

Параметр -x=<language> переопределяет эвристику программ драйвера для определения языка исходного файла, он указывает драйверу вызывать компилятор для <language> независимо от этого.

Опция -std=<dialect> выбирает, какой диалект конкретного языка вы хотите использовать. Если вам нужно убедиться, что ваша программа на C++ переносима на старый компилятор C++98, вы можете скомпилировать ее с помощью -std=c++98. -std применяется только к целевому языку: он не будет пытаться компилировать, например. assembler или java как C++98, только исходные файлы, которые драйвер считает C++.

Короче говоря, есть две разные программы-драйверы, упрощающие выбор библиотек для компоновки. Существуют разумные варианты использования для компиляции C++, но без компоновки со стандартной библиотекой C++.

person Casey    schedule 18.11.2013
comment
Это похоже на gcc против g++, не так ли? - person LIU Qingyuan; 17.12.2020

Clang — это название всего компилятора.

Однако с точки зрения командной строки:

  • Clang — это компилятор C.
  • Clang++ — это компилятор C++ (например, g++ — это компилятор C++, тогда как gcc — это компилятор C)

Параметр -std=c++11 включает новый стандарт C++11 (как в g++).

person Claudio    schedule 18.11.2013
comment
Но зачем предлагать флаг опции C++ с компилятором C? Это мой главный вопрос. - person djwbrown; 18.11.2013
comment
Чтобы оставаться совместимым с тем, как gcc ведет дела. - person mah; 18.11.2013
comment
@djwbrown: clang, скорее всего, выяснит, когда запустит код C++, и успешно создаст объектный файл. Разница между clang и clang++ проявляется, когда он пытается связать ваши объектные файлы, где C++ требует другого набора, чем C. clang попытается связать код C, а clang++ код C++. - person Benjamin Bannier; 18.11.2013
comment
@BenjaminBannier, это помогает, но зачем давать вам флаги -x или -std=, если они также не меняют компоновщик на правильный язык? - person djwbrown; 18.11.2013