Разделяемые библиотеки и языковые стандарты

#c #c #shared-libraries

#c #c #разделяемые библиотеки

Вопрос:

AFAIK, ни C99, ни стандарты C не знают об общих библиотеках. Почему это?

РЕДАКТИРОВАТЬ: Какова хорошая практика написания общих библиотек без дублирования версий Linux / Windows?

Спасибо.

Комментарии:

1. Не уверен, что вы подразумеваете под дублированием версий Linux / Windows. Но вот хорошая ссылка на то, как управлять экспортом: gcc.gnu.org/wiki/Visibility

Ответ №1:

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

Ничего общего с каким-либо конкретным языком.

Комментарии:

1. Но разделяемые библиотеки требуют поддержки синтаксиса. Было бы неплохо, если бы Linux и Windows использовали одинаковый синтаксис.

2. @pic11: «общие библиотеки требуют поддержки синтаксиса»? Не совсем. Это все просто externs и инструменты.

3. (Первой системой с разделяемой библиотекой, которую я видел, была AmigaOS.)

4. @pic11: Настольные приложения и веб-приложения тоже кодируются по-разному. Это не меняет язык . Просто способ, которым язык применяется к проблеме.

5. @С.Лотт. Настольные приложения и веб-приложения тоже кодируются по-разному, суть не в этом. Скажем, я хочу создать свою собственную общую библиотеку регулярных выражений для Linux и Windows. Статическая версия библиотеки будет работать практически на любой платформе C (Win, Linux, iPhone, OSX, настольный компьютер, сервер) практически с нулевыми изменениями, пока я придерживаюсь стандартного C . Но версия с разделяемой библиотекой этого не сделает, потому что Visual C и GCC используют разный синтаксис. Я не понимаю, почему синтаксис не может быть одинаковым. Я не говорю, что компилятор и инструменты должны быть стандартизированы.

Ответ №2:

Я могу назвать несколько причин, по которым это имело смысл в 1999 году (как в случае с C99) или даже в 2011 году:

  • Все еще существуют системы, в которых используются C и C , которые не имеют разделяемых библиотек. (Думаю, встроенный.) Если стандарт предписывает что-то, жизнь становится неоправданно сложной для разработчиков компиляторов / библиотек, которые ориентируются на платформы, где вопрос разделяемых библиотек неуместен.

  • Разные операционные системы по-разному выбирают дизайн в отношении разделяемых библиотек. Если бы стандарт предписывал что-то, это ограничивало бы эти варианты. Здесь также есть много неприятного наследия, которое следует учитывать, поскольку реализации разделяемых библиотек развивались с течением времени.

Как и в случае со многими вещами в C и Си , другие, более специфичные для платформы стандарты выполняют достаточно хорошую работу здесь, где сам язык оставил вещи неопределенными. Согласно справочным страницам, которые я только что просмотрел, POSIX.1-2001 указывает dlopen и др. Если вы ориентируетесь на Windows, вы знаете, где найти LoadLibrary / GetProcAddress . __declspec требования для Windows также могут быть обернуты в макрос. Если вас интересуют системы Windows и Posxy, не так уж сложно написать слой, который выполняет соответствующие действия. Я уверен, что многое уже написано и доступно.

Комментарии:

1. Как насчет неофициального стандарта, похожего на boost threads? Просто любопытно.

Ответ №3:

«Как писать разделяемые библиотеки» Ульриха Дреппера,
прочитайте первую страницу о них и их истории.