Я хочу начать с простого использования ссылок, чтобы объяснить свою проблему. Предположим, что существует библиотека z
, которую можно скомпилировать в общую библиотеку libz.dll (D: /libs/z/shared/libz.dll) или в статическую библиотеку libz.a (D: / libs / z / static / libz .a).
Позвольте мне дать ссылку на это, тогда я сделаю так:
gcc -o main.exe main.o -LD:/libs/z/static -lz
Согласно этой документации, gcc будет искать libz.a, который
архивные файлы, членами которых являются объектные файлы
Еще я умею:
gcc -o main.exe main.o -LD:/libs/z/shared -lz
В документации выше не упоминается, что флаг -l
будет искать lib<name>.so
.
Что будет, если у меня libz.a и libz.dll окажутся в одном каталоге? Как библиотека будет связана с программой? Зачем мне нужны флаги -Wl,-Bstatic
и -Wl,-Bdynamic
, если -l
ищет как общие, так и статические библиотеки?
Почему некоторые разработчики предоставляют файлы .a с файлами .dll для одних и тех же модулей, если я компилирую дистрибутив разделяемой библиотеки?
Например, Qt предоставляет файлы .dll в каталоге bin с файлами .a в каталоге lib. Это одна и та же библиотека, но построенная как общая и статическая соответственно? Или файлы .a - это какие-то фиктивные библиотеки, которые обеспечивают связь с разделяемыми библиотеками, где есть реальные реализации библиотек?
Другой пример - библиотека OpenGL в Windows. Почему каждый компилятор должен предоставлять статическую библиотеку OpenGL, такую как libopengl32.a в MingW?
Для чего используются файлы с расширениями .dll.a и .la?
P.S. Здесь много вопросов, но я думаю, что каждый зависит от предыдущего, и нет необходимости разбивать их на несколько вопросов.