Что мне следует использовать: 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é