Что мне следует использовать: libc ++ или libstdc ++? [закрыто]


91

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


1
Я не знаю, но вы можете найти это интересным: clang-developers.42468.n3.nabble.com/…
— DarenW

3
Этот ответ может быть полезным.
— Янтао Се

2
если вы ссылаетесь на opencv, используйте libstdc ++. вот почему stackoverflow.com/questions/13037659/…
— Loozie 07

Ответы:


89

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

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

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


3
Не могли бы вы уточнить / предоставить ссылки о статусе полноты libc ++ в Linux? Я не совсем понимаю, почему это будет зависеть от платформы, поскольку libc ++ - это просто набор заголовков стандартной библиотеки. Или вы имеете в виду, что нужно создать Clang по отношению к библиотекам времени выполнения LLVM, которые плохо поддерживаются в Linux?
— TemplateRex

1
@TemplateRex, я не знаю текущего статуса, можете посмотреть на libcxx.llvm.org . Я не слежу за libc ++, поэтому вы спрашиваете не того человека, но предполагаете ли вы, что «куча заголовков стандартной библиотеки» никогда не будет иметь кода, специфичного для платформы?
— Джонатан Уэйкли

Что ж, поскольку вы можете установить Linux почти на то же оборудование Apple, на котором работает Mac OS X, мне интересно, откуда взялась зависимость от платформы в заголовках C ++? Возможно, некоторые оболочки вокруг встроенных встроенных функций ЦП или ввода-вывода и обработки исключений зависят от системы, но я понял, что такие вещи обрабатываются в двоичных слоях типа librcxxrt. Разве заголовки стандартной библиотеки не должны быть более или менее подключаемыми?
— TemplateRex

4
Я не про железо говорю. Опять же, я понятия не имею о libc ++, но большинство стандартных библиотек C ++ реализованы на основе библиотеки C ОС, и, например, отображение std::ctype_base::maskзначений в <ctype.h>константы полностью зависит от платформы. (Внутренние функции ЦП предоставляются компилятором, обработка исключений выполняется на низкоуровневом уровне ABI, но ввод-вывод обычно полностью выполняется в библиотеках C ++ и C, а не на низкоуровневых материалах).
— Джонатан Уэйкли

1
@abergmeier, это фиктивный аргумент, потому что (при использовании с GCC или другими подходящими процессами компиляции) libstdc ++ не налагает никаких ограничений на код, использующий его, независимо от того, связан ли он динамически или статически. Это не LGPL. Пожалуйста, не распространяйте FUD. gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
— Джонатан Уэйкли,

30

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

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

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

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


2
Clang - это не замена GCC ... Просто еще один компилятор.
— Исаак Паскуаль,

4
@IsaacPascual Марио имел в виду то, что clang официально поставил перед собой цель стать заменой выдающемуся компилятору на платформе, на которой вы его запускаете (например, gcc при запуске в Linux). То же самое для компилятора Intel afaik. Это их способ получить более широкое распространение.
— Johan Boulé
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.