Библиотеки содержат скомпилированный объектный код (не "компилируемый код" - это будет файл .c). Библиотека представляет собой упакованную коллекцию объектных модулей.
Заголовки (как правило) содержат декларативный исходный код - они допускают раздельную компиляцию и компоновку, предоставляя компилятору видимость типов данных и сигнатур функций и данных, определенных в другом объектном коде, для связи - либо из библиотек, либо из отдельныхскомпилированные исходные (объектные) модули.
Обычно я говорю, потому что #include
не является частью языка C, а скорее директивой препроцессора (как любая строка, начинающаяся с #
в C). Препроцессор вставляет содержимое #include
'ed-файла перед передачей его самому компилятору, так что фактически он может содержать любой допустимый код, но это часто вызывает проблемы при связывании с другим кодом, который также может включать тот же самый кодheader.
Это не вопрос "библиотек против заголовков", поскольку они служат совершенно другим целям и участвуют в разных концах процесса pre-process -> compile -> link. Библиотека обычно имеет связанный заголовочный файл, содержащий объявления ее открытых (внешних) интерфейсов.