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