Вы можете передать как -static
, так и -shared
в связи GCC. Их
комбинированный эффект такой же, как вы описали в своей ссылке на llvm,
и это всегда имело место для GCC.
-shared
направляет связь GCC для создания общей библиотеки, а не программы,
которого он достигает, передав опцию -shared
своему вызову
компоновщик.
-static
направляет связь GCC, чтобы игнорировать общие библиотеки при разрешении
параметры библиотеки ввода -lname
. По умолчанию -lname
будет разрешен
поиск по указанным или по умолчанию каталогам поиска компоновщика для
общая библиотека libname.so
(в Windows [lib]name.dll
)
или статическая библиотека libname.a
(в Windows также [lib]name.lib
) и предпочесть
общая библиотека, если они оба находятся в одном каталоге. -static
просто исключает все общие библиотеки из поиска. GCC достигает этого, передавая опцию -Bstatic
до его вызова компоновщика в позиции в сгенерированном компоновщике
командная строка, которая предшествует всем опциям -lname
.
Документация компоновщика GNU для -Bstatic
является явной
что этот параметр соответствует -shared
и что результатом является создание общей библиотеки
все зависимые библиотеки которых были статически разрешены.
-Bstatic
-dn
-non_shared
-static
Не создавать ссылки на общие библиотеки. Это имеет смысл только на платформах, для которых поддерживаются общие библиотеки.
Различные варианты этой опции предназначены для совместимости с различными системами. Вы можете использовать эту опцию несколько раз в командной строке:
это влияет на поиск в библиотеке параметров -l, которые следуют за ним. Эта опция также подразумевает --unresolved-symbols = report-all.
Эта опция может использоваться с -shared. Это означает, что создается общая библиотека, но все внешние ссылки библиотеки должны быть разрешены путем извлечения записей из статических библиотек.
(акцент мой).
Хотя статическое связывание разделяемой библиотеки в принципе ограничено только связыванием
так же, как статическая связь программы, на практике она часто встречается
загвоздка в Unix и Linux, потому что весь объектный код связан с общей библиотекой ELF
libname.so
должно быть Независимый от позиции код ,
в соответствии с параметром компиляции GCC -fPIC
, тогда как объектные файлы предназначены для
архивированные в статических библиотеках обычно не компилируются с -fPIC
. Использование связей
-shared ... -static
, таким образом, склонны к сбою, потому что необходимые статические библиотеки содержат
объектные файлы не PIC.
Однако у вас нет этой проблемы с GCC в Windows, потому что
нет такого различия, как PIC v. non-PIC в Windows PE
код объекта.