Нет, файл заголовка не всегда достаточно.Заголовочный файл может содержать только объявления функций и классов и других необходимых вам вещей, , а не их реализации.
Существует большой разрыв между этим кодом:
void Multiply(int x, int y);
и этот код:
void Multiply(int x, int y)
{
return x * y;
}
Первый - это объявление, а второй - определение или реализация.Обычно первый пример помещается в заголовочные файлы, а второй - в файлы .CPP (если вы создаете библиотеки).Если вы включили заголовок с первым и ничего не связали, как ваше приложение должно знать, как реализовать Multiply?
Теперь, если вы используете файлы заголовков, которые содержат код, который ВСЕМ встроен, тоВам не нужно ничего связывать.Но если хотя бы один метод НЕ является встроенным, но имеет реализацию в файле .CPP, скомпилированном в файл .lib, тогда вам нужно будет связать его в файле .lib.
[ПРАВИТЬ] При использованииИмпортируйте библиотеки, вы говорите компоновщику НЕ включать детали реализации импортированного кода в ваш двоичный файл.Вместо этого ОС будет загружать DLL импорта во время выполнения в ваш процесс.Это уменьшит размер вашего приложения, но вам придется поставлять с ним еще одну DLL.Если реализация библиотеки изменится, вы можете просто переназначить другую DLL своим клиентам, и вам не нужно будет переустанавливать все приложение целиком.
Есть еще один вариант, когда вы можете просто связать библиотеку, а вы ненужно отправить еще одну DLL.В этом варианте компоновщик будет включать реализацию в ваше приложение, увеличивая его размер.Если вам нужно изменить детали реализации в импортированной библиотеке, то вам придется перекомпилировать и заново связать все ваше приложение, и переназначить все это вашим клиентам.