Заголовки содержат только объявления для функций API, а не их определения. Определения можно найти, связав соответствующие библиотеки.
Например, скопируйте в файл .c
следующее:
#include <Windows.h>
int main()
{
MessageBoxW(NULL, L"Hello World", L"", MB_OK);
return 0;
}
Попробуйте скомпилировать его в командной строке Visual Studio с помощью команды cl example.c
. Вы увидите сообщение об ошибке:
example.obj : error LNK2019: unresolved external symbol __imp__MessageBoxW@16 referenced in function _main
Обратите внимание, что сама компиляция действительно завершается успешно; это компоновщик, который жалуется на отсутствующее определение функции.
Если вместо этого вы скомпилируете его с помощью cl example.c /link user32.lib
, компоновщик найдет определение для MessageBox
. Вы также можете просто link example.obj user32.lib
.
Итак, чтобы ответить на ваш вопрос: заголовкам не нужно знать, в каких библиотеках находятся функции, потому что проект должен предоставить соответствующие ссылки на библиотеки. К счастью, документация MSDN для Windows функций API подскажет вам, в какой DLL находится функция и какую библиотеку связать.