В общем, вам нужны оба.
Включаемые файлы содержат объявлений типов, прототипов функций, inline
функций, #define
s, ..., в общем, каждая информация о библиотеке, которая нужна компилятору знать об этом при компиляции ваших файлов.
Статические библиотеки вместо этого содержат фактический объектный код функций библиотеки. Если заголовки содержат прототипы, статические библиотеки содержат (скомпилированные) определения функций, т. Е. Объектные модули, которые компоновщик свяжет с вашим.
Если вы включили только заголовочный файл без привязки к статической библиотеке, компоновщик будет жаловаться на отсутствующие определения, поскольку вы будете использовать функции , объявленные в заголовке, но не определенные где угодно (= без реализации). С другой стороны, если вы связываете статическую библиотеку только без предоставления заголовка, компилятор будет жаловаться на неизвестные идентификаторы, поскольку он не будет иметь понятия о используемых вами символах библиотеки.
Концепция очень похожа на то, когда вы компилируете многофайловый проект: для доступа к определениям, записанным в других .cpp
, вам нужно включить только заголовок с их объявлениями, а компоновщик в конце связывает вместе различные объекты модули.
Что касается DLL, обычно предоставляется библиотека импорта ; Библиотеки импорта похожи на статические библиотеки, но вместо того, чтобы содержать весь код библиотеки, они содержат небольшие заглушки, которые вызывают функции в dll. Каждый раз, когда вызов библиотечной функции встречается в одном из ваших объектных модулей, компоновщик направляет его в заглушку, которая, в свою очередь, перенаправляет его в код в dll 1 . В общем, при работе с dll в Windows у вас обычно есть .h
(прототипы / ...), .lib
(библиотека импорта, на которую вы ссылаетесь, содержит заглушки) и .dll
(библиотека динамического связывания содержит актуальный код библиотеки).
Кстати, некоторые библиотеки «только заголовки» (вы можете найти много в boost), что означает, что весь их код помещен в заголовок, поэтому статическая библиотека не требуется. Такие библиотеки часто состоят только из встроенного кода (функции / классы / ...) и шаблонов, для которых не требуется отдельное определение.
Зачастую это делается потому, что статические библиотеки являются отвратительными животными по нескольким причинам:
- Вы должны явно ссылаться на них;
- , поскольку они связаны непосредственно с вашим кодом, они должны использовать точно такую же библиотеку времени выполнения C / C ++, что означает, что, по крайней мере в Windows, нецелесообразно распространять статические библиотеки (разные компиляторы, разные версии компилятора, разные конфигурации одного и того же компилятора используют разные стандартные библиотеки, распространение статической библиотеки для каждой комбинации этих аспектов было бы по меньшей мере нецелесообразно);
- из-за этого, как правило, вам нужно сначала скомпилировать свою собственную версию статической библиотеки, а затем ссылаться на нее.
Сравните все это, просто включив заголовочный файл ...:)
- На самом деле современные наборы инструментов могут распознавать эти заглушки и избегать дополнительного шага косвенности. Подробности смотрите в этой серии Раймонда Чена.