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