Должен ли я использовать libc++ или libstdc++?

Я разрабатываю исполняемые файлы интерфейса командной строки для OSX и Linux, используя c/С++. Проект будет связан с opencv. Должен ли я использовать libc++ или libstdc++?


person Loozie    schedule 20.02.2013    source источник
comment
Я не знаю, но это может вас заинтересовать: clang-developers.42468.n3.nabble.com/   -  person DarenW    schedule 20.02.2013
comment
Этот ответ может быть полезен.   -  person Yantao Xie    schedule 20.02.2013
comment
если вы ссылаетесь на opencv, используйте libstdС++. вот почему stackoverflow. ком/вопросы/13037659/   -  person Loozie    schedule 07.03.2013


Ответы (2)


Я бы использовал родную библиотеку для каждой ОС, то есть libstdc++ в GNU/Linux и libc++ в Mac OS X.

libc++ не на 100% завершен в GNU/Linux, и нет никакого реального преимущества в его использовании, когда libstdc++ более совершенен. Кроме того, если вы хотите связать какие-либо другие библиотеки, написанные на C++, они почти наверняка будут собраны с помощью libstdС++, поэтому вам также потребуется связать ее, чтобы использовать их.

Дополнительная информация здесь о полноте libc++ на различных платформах.

person Jonathan Wakely    schedule 28.05.2013
comment
Не могли бы вы уточнить/предоставить ссылки о статусе полноты libc++ в Linux? Я не совсем понимаю, почему это зависит от платформы, поскольку libc++ - это просто набор заголовков стандартной библиотеки. Или вы имеете в виду, что нужно собрать Clang для библиотек времени выполнения LLVM, которые плохо поддерживаются в Linux? - person TemplateRex; 28.11.2013
comment
@TemplateRex, я не знаю текущий статус, вы можете посмотреть на libcxx.llvm.org. Я не слежу за libc++, поэтому вы спрашиваете не того человека, но вы предполагаете, что куча заголовков стандартной библиотеки никогда не будет иметь кода для конкретной платформы? - person Jonathan Wakely; 29.11.2013
comment
Что ж, поскольку вы можете установить Linux практически на то же оборудование Apple, на котором работает Mac OS X, интересно, откуда взялась зависимость от платформы в заголовках C++? Возможно, некоторые оболочки вокруг встроенных встроенных функций ЦП или операций ввода-вывода и обработки исключений зависят от системы, но я понимаю, что такие вещи обрабатываются в двоичных слоях типа librcxxrt. Разве заголовки стандартной библиотеки не должны быть более или менее подключаемыми? - person TemplateRex; 29.11.2013
comment
Я не говорю об оборудовании. Опять же, я понятия не имею о libc++, но большинство стандартных библиотек C++ реализованы в библиотеке C ОС, и, например. отображение значений std::ctype_base::mask в константы <ctype.h> полностью зависит от платформы. (Внутренние функции ЦП предоставляются компилятором, обработка исключений выполняется низкоуровневым уровнем ABI, но ввод-вывод обычно полностью выполняется в библиотеках C++ и C, а не в низкоуровневых материалах). - person Jonathan Wakely; 29.11.2013
comment
Спасибо, Джонатан, отличная информация. Я не хотел беспокоить вас по поводу libc++, в частности, поскольку я знаю, что вы находитесь в другом лагере, но мне просто интересно, где в стандартной библиотеке появляется зависимость от платформы. Еще раз спасибо, что нашли время, чтобы объяснить это. - person TemplateRex; 29.11.2013
comment
@JonathanWakely Есть один сильный аргумент в пользу использования libc++. Это статическое связывание, что может быть недопустимо при наличии лицензии libstdc++. - person abergmeier; 08.05.2016
comment
@abergmeier, это ложный аргумент, потому что (при использовании с GCC или другими подходящими процессами компиляции) libstdc++ не накладывает никаких ограничений на код, использующий его, независимо от того, связан ли он динамически или статически. Это не LGPL. Пожалуйста, не распространяйте FUD. gcc.gnu.org/onlinedocs/libstdc++/faq.html# faq.license.what - person Jonathan Wakely; 08.05.2016
comment
@JonathanWakely Ах, интересно. - person abergmeier; 08.05.2016

Основные дистрибутивы Linux не предоставляют LLVM libc++, потому что:

  1. В отличие от Apple и FreeBSD, GPL+3 не является проблемой, поэтому здесь нет необходимости реализовывать еще один стек.
  2. Компоненты Linux веками разрабатывались на базе GNU libstd++. Некоторые из них не строятся ни на чем другом.
  3. Хотя libc++ сильна в новых функциях, у нее есть некоторые проблемы с устаревшим кодом.

Если со временем libc++ станет частью дистрибутивов, то это будет необязательный компонент. связывание с ним, вероятно, потребует дополнительных опций.

Как сказал Джонатан, вы должны использовать любой инструмент, включенный по умолчанию. Clang безопасен для использования в Linux, поскольку настроен как замена GCC, поэтому в этом аспекте вам не нужно беспокоиться о двух компиляторах. Кроме того, поскольку вы ориентируетесь на две платформы, вам следует взглянуть на cmake.

person Mario Vazquez    schedule 05.01.2014
comment
Clang не является заменой GCC... Просто еще один компилятор. - person Isaac Pascual; 15.11.2016
comment
@IsaacPascual Что Марио имел в виду, так это то, что clang официально ставит перед собой цели разработки, чтобы стать заменой известного компилятора на платформе, на которой вы его запускаете (например, gcc при запуске в Linux). То же самое для компилятора Intel, на самом деле. Это их способ получить более широкое признание. - person Johan Boulé; 06.08.2018