Распространяются ли библиотеки C с текстовыми заголовочными файлами вместе с двоичными файлами? - PullRequest
3 голосов
/ 20 апреля 2019

Я изучаю статические и динамические библиотеки в C и как их создавать.

Одна вещь, которая меня беспокоит, это:

Предположим, файл использует библиотеку mylibrary делая #include <mylibrary.h>.

Означает ли это, что библиотеки C распространяются вместе с соответствующими текстовыми заголовочными файлами?Или mylibrary.h каким-то образом волшебным образом экспортируется из файла двоичной библиотеки?

Различается ли это между различными подходами, или библиотека является статической или динамической?

1 Ответ

1 голос
/ 20 апреля 2019

Да, и в зависимости от платформы вы можете распространять с ней еще больше файлов.Это довольно грязная история.По крайней мере, не имеет значения, является ли библиотека статической или динамической (кроме параметров компоновщика).

Файл заголовка необходим, потому что скомпилированный двоичный файл не содержит достаточно информации для использования компилятором.С некоторой дисперсией на основе платформы двоичный файл C обычно имеет достаточно метаданных, чтобы идентифицировать функции и глобальные переменные по их имени.Эти метаданные не включают типы (или количество) параметров, возвращаемые типы, определения структуры или объединения, тип или размер глобальных переменных и т. Д. Вся эта информация обычно кодируется в заголовках, которые распространяются вместе с библиотекой.(Удобно, что это также означает, что все, что не существует в заголовке, скрыто от разработчика; это то, что позволяет создавать непубличные функции в библиотеке, которые пользователи не должны вызывать напрямую.)

На некоторых платформах двоичные файлы даже не содержат имен функций.Вместо этого на функции ссылается их положение в «порядковой таблице».На этих платформах библиотека должна содержать заголовок, исполняемый двоичный файл и дополнительный файл, который преобразуется из имени функции в заголовке в индекс функции в порядковой таблице, например, «void hello (void)».«может быть» функцией с индексом 3 в порядковой таблице »для компоновщика.

И наоборот, включение заголовка (обычно) не связывает библиотеку, которую он сопровождает.Это возможно на некоторой платформе, такой как Windows, на которой есть специальные директивы компилятора, которые вы можете поместить в заголовок и которые говорят компоновщику ссылаться на некоторую библиотеку, но это не стандартное поведение, и вы не можете ожидать, что оно будетреальность на любой другой платформе.

Готовятся к выпуску модули, которые обеспечивают лучший пользовательский интерфейс для связи с двоичными файлами.Модуль - это еще один файл, который вы можете упаковать в свой бинарный файл и который гласит: «Вот все мои заголовки и вот все мои библиотеки».Используя модули, можно написать что-то вроде «import MyLibrary;»и вы получите все заголовки и все необходимые вам аргументы компоновщика.Я считаю, что еще нет модулей C-стандарта;C ++ становится там с C ++ 20.

...