Почему я должен предоставлять * .lib файлы, которые я использую, компилятору только для некоторых библиотек? - PullRequest
0 голосов
/ 10 июня 2019

Я следовал некоторым учебникам по использованию некоторых библиотек C для разработки игр на Windows. При использовании некоторых библиотек opengl (freeglut, glew) мне просто нужно скомпилировать, используя "cl file.c", и если у меня есть правильные dll-файлы в текущем каталоге, он скомпилируется и будет работать нормально.

Но для SDL я должен явно предоставить файлы lib, например, msgstr "cl sdlprog.c SDL2.lib SDL2main.lib". Я также должен указать, что это консольная программа с "/ link /subsystem:console".

Зачем мне делать эти вещи для SDL? Программа opengl прекрасно компилируется без каких-либо упоминаний о файлах lib.

Я убедился, что все файлы lib находятся в правильном месте. Они в том же месте, куда я положил файлы opengl lib.

1 Ответ

2 голосов
/ 10 июня 2019

Некоторые библиотеки загружаются динамически и доступны через указатели функций.В этих случаях библиотеки не должны быть явно связаны во время компиляции.Другие библиотеки могут быть статически связаны, если они не требуют динамической загрузки, но связывание выполняется во время компиляции.Тогда есть некоторые библиотеки, которые связаны во время компиляции, но они просто предоставляют простой в использовании интерфейс для процесса динамической загрузки.Хорошим примером этого является таблица адресов импорта в файлах Win32 PE.Например, вызов библиотеки NtTerminateProcess находится в библиотеке ntdll.Вы можете динамически вызывать NtTerminateProcess, вызывая LoadLibrary и GetProcAddress, или вы можете связать его во время компиляции, что создаст для вас интерфейс;Тем не менее, ntdll все равно необходимо динамически загружать во время выполнения.Связывание этого времени компиляции не было статичным, оно просто позволяло вам вызывать NtTerminateProcess без использования LoadLibrary / GetProcAddress.

Таким образом, вопрос сводится к разнице между статическими ссылками, что делает opengl.Или динамическое связывание, которое требуется для sdl.И, как я упоминал ранее, динамическая загрузка, которая во время выполнения выделяет память для загружаемого модуля и загружает его по адресу, указанному в ОС.Уже есть публикация, которая немного освещает это:

Разница между статической связью и динамической связью

разница между динамической загрузкой и динамической связью?

При статическом связывании, если ваша библиотека когда-либо изменится, вам нужно будет перекомпилировать двоичный файл.В случае динамического связывания, вам не нужно перекомпилировать двоичный файл только DLL.

...