Включение заголовка в ваш исходный код делает объявления из этого заголовка доступными для компилятора. Если компилятор не может найти объявление для используемой вами библиотечной функции (константы, макроса и т. Д.), Он не может сгенерировать объектный код, который ссылается на эту функцию.
Как только компиляция завершится успешно, вы получите объектный код, содержащий несколько символов. Чтобы объектный код был полезен, эти символы на самом деле должны ссылаться на что-то. Вот тут и вступает компоновщик - он разрешает символы в только что скомпилированном коде в соответствующий объектный код в используемых вами двоичных библиотеках.
Итак, да, вам нужно указать компоновщику, какие файлы .lib связать - аналогично тому, как вы указали компилятору (посредством ваших директив #include), на какие заголовочные файлы обращаться. Если компоновщик не может разрешить символ, компоновка не удастся (я полагаю, это ошибка компоновщика, которую вы получили).
На самом деле я не использую Visual Studio, но согласно этой статье MSDN , VS по умолчанию ссылается на LIBC.LIB и целый ряд других библиотек. Если вы используете другую статическую библиотеку, которая по умолчанию не связана, это дополнительная зависимость.