Статическое и динамическое / общее соединение с MinGW

Я хочу начать с простого использования ссылок, чтобы объяснить мою проблему. Предположим, что есть библиотека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.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?

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

Ответы на вопрос(1)

Ваш ответ на вопрос