Как C заголовочные файлы импортируют функции win32api? - PullRequest
3 голосов
/ 17 января 2020

короткий вопрос.

Когда я делаю:

#include <windows.h>

CreateProcess(..)

Как заголовочный файл знает, как подключить меня к правильной DLL?

Есть ли словарь внутри этих заголовочных файлов, который отображает каждую функцию win32api на соответствующую DLL?

Ответы [ 3 ]

2 голосов
/ 17 января 2020

Заголовочные файлы не знают или не заботятся о расположении функций. Заголовочный файл просто объявляет функции. Когда вы вызываете функции в своем коде, компилятор просто генерирует ссылки в объектном файле, которые отмечают, какие функции вызываются.

После завершения работы компилятора компоновщик объединяет все объектные файлы вместе. и обновляет ссылки на функции, чтобы они указывали на фактические реализации, независимо от того, находятся они в DLL или нет. Таким образом, вы должны предоставить компоновщику, а не компилятору, необходимую информацию, необходимую для того, чтобы знать, какие объектные файлы и файлы импорта DLL нужно искать, где можно найти функции.

Большинство make-файлов проекта для обычного компилятора / Цепочки инструментов компоновщика обычно включают набор файлов импорта DLL по умолчанию для просмотра компоновщиком, например kernel32.lib (где можно разрешить CreateProcess(A|W)), user32.lib, et c.

2 голосов
/ 18 января 2020

Заголовки содержат только объявления для функций 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 находится функция и какую библиотеку связать.

2 голосов
/ 17 января 2020

Краткий ответ: заголовочный файл НЕ знает о DLL, которая реализует эти функции.

Обычно вы указываете эти DLL для компоновщика.

В качестве альтернативы вы можете использовать #pragma comment(lib, “XXX”) сделать это для вас.

...