установка статической библиотеки под Linux — должна ли она быть похожа на установку динамической библиотеки?

Я провел утро, выясняя, как в make-файле выполнить установку разделяемой библиотеки под Linux.

Так что все в порядке; Теперь у меня есть общий объект и пара программных ссылок на него, одна из которых была создана ldconfig, а другая — мной.

Теперь я также могу создать свою библиотеку как статическую библиотеку.

Когда я проверяю /usr/lib, я вижу, что файлы .a просто находятся... там. Никаких символических ссылок, нумерации версий и выпусков в именах файлов.

Должен ли я упорядочивать свои статические библиотеки с символическими ссылками так же, как я упорядочиваю свои общие объекты, или на самом деле принято просто помещать статическую библиотеку без украшений в /usr/local/lib?


person Community    schedule 10.01.2010    source источник


Ответы (1)


В отличие от разделяемых библиотек, статические библиотеки, размещенные в /lib, не участвуют в разрешении зависимостей динамической компоновки. Они используются только при создании приложения. Поэтому нет необходимости вставлять символические ссылки и точные номера выпусков в их именах файлов.

Когда вы связываете свое приложение со статической библиотекой, компоновщик просто встраивает код того, который он нашел в папке /lib. Если на другой системе статическая библиотека с таким же именем будет отличаться, ваше приложение даже не узнает об этом. Потому что он содержит код статической библиотеки, с которой он был скомпилирован, и его не нужно искать в системе, в которой он работает.

Таким образом, установка статических библиотек должна отличаться от установки общих: на самом деле не требуется точное управление версиями в каталоге /lib.

person P Shved    schedule 10.01.2010
comment
Что произойдет, если у меня есть несколько версий моей статической библиотеки, и я хочу связать разные версии в разных проектах? - person ; 10.01.2010
comment
Когда вы собираете: вы готовите разные экземпляры в разных каталогах и ориентируете свой make-файл на конкретный. С общими библиотеками это в основном то же самое. Когда вы запускаете: вам вообще не нужно иметь статические библиотеки в вашей системе, так как код в статических библиотеках встроен в ваш исполняемый файл. - person P Shved; 10.01.2010
comment
Я понимаю про бег; вы статически связаны, так что к тому времени все кончено. Однако я ничего не понимаю в строительстве; У меня есть два проекта, которые статически связаны с разными версиями одной и той же сторонней статической библиотеки. Как они могут различать разные версии этой библиотеки, когда статические библиотеки просто сбрасываются с одним и тем же именем ('library.a') в каталог библиотеки? - person ; 10.01.2010
comment
Вы также не можете различать общие библиотеки. Различные версии разделяемых библиотек существуют в /lib не для того, чтобы создавать их, а для того, чтобы запускать приложения, созданные для разных версий! Чтобы выполнить сборку с использованием разных версий одной и той же библиотеки, создайте несколько несистемных каталогов и настройте параметры компилятора -L и -I, чтобы они указывали на них. - person P Shved; 10.01.2010
comment
Я читал, что причина, по которой «library.so» является программной ссылкой, заключается в том, что вы можете создавать версии библиотек, отличные от последней версии, например. вы указываете имя ссылки, которое компоновщик найдет, на версию, с которой вы хотите выполнить сборку, в то время как другие имена ссылок указывают на последний выпуск своей версии библиотеки (чтобы вы могли работать с ними). - person ; 10.01.2010
comment
Это верно, но вы, кажется, неправильно понимаете, что это значит. Вы действительно можете собирать не самые последние версии, но эта сборка происходит не на той машине, с которой вы работаете, а на другой машине! Вы также, кажется, смешиваете компоновщик (программа ld) и динамический компоновщик (программа, которая находит правильные файлы so при запуске). Попробуйте учесть еще один момент: файлы заголовков в /usr/include не являются программными ссылками, и все они соответствуют последней установленной версии. В любом случае, пожалуйста, попробуйте прочитать больше информации об общих библиотеках; попробуйте здесь: tldp.org/HOWTO/Program-Library-HOWTO/shared -libraries.html - person P Shved; 10.01.2010