Почему использование библиотек C ++ так сложно?

14

Прежде всего, я хочу отметить, что я люблю C ++, и я один из тех, кто думает, что код на C ++ проще, чем на Java. За исключением одной крошечной вещи: библиотеки.

В Java вы можете просто добавить jar к пути сборки, и все готово.

В C ++ обычно требуется установить несколько путей для файлов заголовков и самой библиотеки. В некоторых случаях вам даже нужно использовать специальные флаги сборки. Я в основном использовал Visual Studio, Code Blocks и вообще не использовал IDE. Все 3 варианта не сильно отличаются при использовании внешних библиотек.

Интересно, почему не было сделано более простой альтернативы для этого? Например, наличие специального файла .zip, в котором есть все, что вам нужно, в одном месте, чтобы IDE могла выполнить всю работу за вас, устанавливая флаги сборки. Есть ли технический барьер для этого?

Pijusn
источник

Ответы:

15

C ++ был разработан для улучшения языка C путем создания более простого и автоматизированного языка с поддержкой объектно-ориентированного программирования. Но это ничего не изменило и не улучшило способ обработки внешних библиотек и заголовочных файлов. C ++ не имеет модульной системы, как более современные языки - он все еще использует препроцессор C и систему компоновщика. Поскольку одной из заявленных целей C ++ была обратная совместимость с кодом C, это не удивительно. Любая модульная система C ++ должна работать вместе со старой системой заголовочных файлов C / компоновщика. Комитет по стандартам C ++ просто не удосужился разработать более современную модульную систему. (Хотя они работают над этим, см. Комментарий Клаима ниже.)

Чарльз Сальвия
источник
8
Последняя строка не совсем верна: система модулей работает с 2004 года (первый документ), но подразумевает такую ​​большую работу, что ее нельзя было даже предусмотреть для последнего стандарта, поскольку было бы недостаточно реализации для поддержать предложение. Эта реализация была в wortk (наряду с другими черновиками), чтобы представить следующий стандарт C ++. Дело не в том, что это не является приоритетом для дизайнеров C ++, это просто одна из этих функций, которую вы не можете ошибиться, она должна поддерживать ретро-совместимость (с большинством кода C и C ++ 11) и безумно трудно понять, что правильно. Так что это занимает много времени.
Klaim
Потрясающие. Спасибо, Клаим, за информацию. Обязательно проверим. Это очень увлекательно :)
Pijusn
Большинство языков остаются вне бизнеса стандартизации связей, потому что механизм может варьироваться между операционными системами. Природа Java везде, где требуется выполнение, требует указания определенного формата связи и библиотеки. В этом нет ничего плохого, но это приносит некоторые накладные расходы, которые могут быть нежелательны во всех случаях.
Blrfl
Честно говоря, мне страшно читать, что комитет по стандартам C ++ работает над системой модулей для самого языка . C ++ уже является огромным и сложным языком, и попытка добавить такую ​​чувствительную функцию к нему может быть очень рискованной. Как отметил ниже Карл Билефельдт, эта проблема уже нашла хорошее решение на уровне платформы (система пакетов Linux) и, вероятно, может быть решена очень хорошо большинством IDE без особых усилий. Посмотрите, например, как Qt Library и Qt Creator справляются с этой проблемой.
AlexBottoni
1
@AlexBottoni, я действительно сомневаюсь, что они придумают стандартизированную систему модулей в любое время в этом столетии. Они даже не включили концепции в C ++ 11, потому что не могли договориться о точной реализации. Модульная система, которая работает вместе с системой заголовка / компоновщика, еще более сложна, и мы, вероятно, не увидим ее в течение очень долгого времени.
Чарльз Сальвия
2

Это не технический барьер. В Linux ваш «специальный zip-файл» представляет собой пакет library-dev, который вы устанавливаете с помощью менеджера пакетов, и установить флаги include и linker так же просто, как добавить пару строк в ваш файл, configure.acкоторый использует pkg-config для настройки.

Pkg-config также доступна для Windows, но культурные барьеры помешали ее широкому распространению. Unix имеет богатую историю обеспечения переносимости за счет распространения исходного кода, поэтому они включают инструменты разработки бесплатно. Windows имеет богатую историю поощрения только бинарного распространения и взимания платы с разработчиков за инструменты. Когда вы зарабатываете на продаже библиотек, третьим сторонам не имеет смысла их предоставлять.

Карл Билефельдт
источник