#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:
«Как писать разделяемые библиотеки» Ульриха Дреппера,
прочитайте первую страницу о них и их истории.