Libtool linux что это

А что именно делает libtool, и зачем оно надо?

А что именно делает libtool, и зачем оно надо?

в педивикии забанили?

А что именно делает libtool, и зачем оно надо?

libtool занимается своими черными пакостными делами и портит жизнь честным гентушникам.

А что именно делает libtool, и зачем оно надо?

libtool — это такой набор скриптов, входящих в состав GNU toolchain, которые, по идее, должны облегчить процесс сборки и использования динамических библиотек (.so) на разных ОС. Т.е., есть скрипты создания разделяемых библиотек, скрипты линковки бинарников с библиотеками.

На практике, работа libtool в линуксе доставляет ряд проблем. По <,/usr>/lib оказываются замусорены всякими .so, в которых записана ложная информация («do not delete this file, it is required for dynamic linking» или что-то такое); libtool некорректно линкует бинарники и либы: в зависимости (не зависимости пакетного менеджера, а в набор прилинкованных библиотек) конечных бинарников добавляются все «глубокие» зависимости всех либ, в том числе и лишние. В результате нельзя просто взять и обновить либу — надо обновлять и _все_ зависимые либы и программы.

Некоторые дистры (например, gentoo) применяют особую магию для борьбы с libtool. Например, больше не устанавливают libtool’овские заглушки для библиотек, линкуют только необходимый набор библиотек (чтобы библиотеки можно было нормально обновлять; а то не дело — у библиотеки libxcb.so пропала зависимость от libxcb-x11.so, так из-за этого половина всех программ перестает работать).

А что именно делает libtool, и зачем оно надо?

> libtool — это такой набор скриптов, входящих в состав GNU toolchain, которые, по идее, должны облегчить процесс сборки и использования динамических библиотек (.so) на разных ОС. Т.е., есть скрипты создания разделяемых библиотек, скрипты линковки бинарников с библиотеками.

А зачем лишняя обёртка, если можно просто вызват cc или ld?

А что именно делает libtool, и зачем оно надо?

Я так понимаю это то самое говно, что входит в состав уёбищного autotools? Вот уж источник геммороя и головной боли

Источник

Libtool linux что это

GNU Libtool is a generic library support script that hides the complexity of using shared libraries behind a consistent, portable interface.

To use Libtool, add the new generic library building commands to your Makefile, Makefile.in, or Makefile.am. See the documentation for details.

Downloads

Source releases

They are available from the main GNU server (HTTPS, HTTP, FTP) and its mirrors; please use a mirror if possible.

Development sources

They are available via Git. Use the following command to check them out:

Once you have the tree checked out, you can keep it up to date by using «git pull» . Please see the Libtool project page for more information.

Documentation

The GNU Libtool manual is available in various formats. You may also find information about GNU Libtool by running «info libtool» on your system.

Mailing Lists

  • New releases of GNU Libtool, Autoconf, Automake, and M4 are announced on autotools-announce@gnu.org.
  • Important announcements about Libtool and most other GNU software are made on info-gnu@gnu.org.
  • You can also subscribe to the Atom feed for Libtool-specific news, or watch GNU Planet for Libtool items among other GNU news.

To subscribe to any GNU mailing lists, please send an empty mail with a Subject: header line of just “subscribe” to the relevant -request list. For example, to subscribe yourself to the GNU announcement list, you would send mail to with no body and a Subject: header line of just “subscribe”. Or you can use the mailing list web interface.

Request an Enhancement

If you would like any new feature to be included in future versions of Libtool, please send a request to .

Please remember that development of GNU Libtool is a volunteer effort. You too can contribute to its development. For general information about contributing to the GNU Project, please read How to help GNU.

Maintainer

Libtool is currently looking for a maintainer.

“The Free Software Foundation (FSF) is a nonprofit with a worldwide mission to promote computer user freedom. We defend the rights of all software users.”

Please send general FSF & GNU inquiries to . There are also other ways to contact the FSF. Broken links and other corrections or suggestions can be sent to .

Читайте также:  Windows application error report

Please see the Translations README for information on coordinating and contributing translations of this article.

Copyright © 2007, 2008, 2011 Free Software Foundation, Inc.

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

GNU Libtool

GNU Libtool
Разработчики: GNU Project
Выпущена: 9 июля 1997 года
Постоянный выпуск: 2.4.6 / 15 февраля 2015 года
Операционная система: кроссплатформенное программное обеспечение
Тип ПО: инструментальное программное обеспечение
Лицензия: GNU GPL v2
Веб-сайт gnu .org /software /libtool /

GNU Libtool — это сценарий поддержки общих библиотек. Libtool скрывает всю сложность использования разделяемых библиотек за согласованным и переносимым интерфейсом и управляет созданием статических и динамических библиотек на разных UNIX-подобных операционных системах.

Пакет GNU Libtool является частью системы сборки GNU.

Содержание

Описание

Каждая операционная система по-своему работает с разделяемыми библиотеками, а некоторые платформы не используют их вообще. Поэтому возникают проблемы при создании кроссплатформенного программного обеспечения. Раньше, когда разработчику нужно было воспользоваться преимуществом разделяемых библиотек, перед ним вставала задача написания специальных расширений для каждой платформы, на которой будет запущена программа. Также ему предстояло разработать интерфейс управления так, чтобы установщик пакетов мог выполнять сборку определенного типа библиотек.

GNU Libtool позволяет упростить данный процесс посредством инкапсуляции особенностей конкретной платформы и пользовательского интерфейса в одном сценарии. Libtool разработана таким образом, что вся функциональность предоставляется через обобщенный интерфейс, но некоторые особенности, которые могут привести к нежелательным последствиям, скрыты от разработчика.

Используя согласованный интерфейс утилиты Libtool, пользователям предстоит запустить только конфигурационный сценарий (или его эквивалент), чтобы пакет с исходным кодом произвел сборку разделяемых библиотек, всю остальную работу выполняет Libtool.

История разработки Libtool

Начиная с 1995 года, некоторые разработчики проекта GNU стали осознавать важность наличия поддержки разделяемых библиотек в своих приложениях. Основными причинами такого решения стали модульность и повторное (многократное, а не copy-paste [1] ) использование кода [2] в программах GNU.

Наличие такой возможности означает, что механизм сборки библиотек в пакетах GNU должен быть универсальным, чтобы предоставлять уставщик пакетов любому типу библиотек. Кроме того, все это усугубляется отсутствием стандартной процедуры создания разделяемых библиотек на разных платформах.

К сожалению, практически каждый из разработчиков UNIX-подобных операционных систем придумывал свой собственный способ создания разделяемых библиотек. Тем не менее, ни одно из этих решений не могло предоставить единого функционала. Особенности присутствовали практически везде – при вызове компилятора, компоновщика, при установке библиотек и даже при вызове отладчика. И поскольку большая часть этих решений не имела документации, существовали некоторые трудности по их использованию.

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

По этой причине была разработана утилита Libtool как независимый shell-сценарий [3] . Она позволяет решить проблемы и противоречия, с которыми сталкиваются разработчики make-файлов [4] при сборке библиотек, благодаря согласованному и многофункциональному интерфейсу.

При разработке пакета GNU Libtool учитывались следующие требования:

  1. Простота использования.
  2. Интеграция с утилитами GNU Autoconf и GNU Automake и наличие собственного независимого от них функционала.
  3. Переносимость на другие (не GNU) платформы.

Основы использования GNU Libtool

Установка Libtool

Последнюю версию пакета Libtool можно загрузить с веб-сайта проекта GNU Libtool.

Для того, чтобы использовать Libtool, необходимо включить в проект следующие файлы:

config.guess — определяет каноническое имя типа системы. config.sub — сценарий проверки канонического имени системы. install-sh — сценарий установки. ltmain.sh — общий сценарий, реализующий основную функциональность Libtool.

Команда libtool

Чтобы начать работу с утилитой Libtool, нужно воспользоваться командой следующего вида:

Данная команда может сопровождаться следующими параметрами:

—config — отображение переменных конфигурации. —debug — перенаправление результатов трассировки сценария в стандартный поток вывода. -n , —dry-run — отображение действий, которые выполнит команда libtool, без создания, изменения и удаления файлов. —features — отображение основных параметров конфигурации; позволяет определить тип создаваемой библиотеки. —finish — то же самое, что и –mode=finish . -h , —help и —help-all — получение справочной информации. —mode=mode — используйте mode для задания типа операции, где mode может принимать одно из следующих значений: сompile — собрать из исходного файла libtool-объект; execute — автоматически установить путь к библиотеке; link — создать библиотеку или исполняемый модуль; install — установить библиотеку или исполняемый модуль; finish — завершить установку libtool-библиотек; uninstall — удалить установленные библиотеки или исполняемые модули; clean — удалить неустановленные библиотеки или исполняемые модули. —tag=tag — использование переменных конфигурации с тегом tag . —preserve-dup-deps — не устранять взаимозависимости дубликатов в библиотеках. —quite или —silent — не отображать никаких результатов или информационных сообщений. -v или —verbose — показать результаты и информационные сообщения, включая те, которые не выводятся по умолчанию. —no-verbose — не показывать никакой дополнительной информации, кроме той, которая выводится по умолчанию. —version — отображение версии утилиты Libtool.

Читайте также:  Vox player для windows

Libtool-библиотека

Libtool создает так называемые Libtool-библиотеки из Libtool-объектов: файл с расширением .lo — PIC [5] -объект для динамических библиотек, и файл с расширением .o — non-PIC-объект для статических библиотек. Из этих файлов выбирается один, который будет использован при компоновке исполняемых файлов и библиотек определенного типа.

Libtool-библиотеки — это целый набор файлов. Главный файл, содержащий описание библиотеки, имеет расширение .la . Объектные файлы, используемые при компиляции, а также результирующие статические и динамические библиотеки, помещаются в подкаталог .libs/ . При установке Libtool автоматически обрабатывает эти файлы, помещая их в нужные каталоги.

Для демонстрации использования утилиты Libtool рассмотрим файл hello.c :

Пример создания динамической библиотеки

Стоит отметить, что некоторые операционные системы не поддерживают динамических библиотек — Libtool автоматически будет создавать при этом только статические библиотеки.

Пример создания статической библиотеки

Libtool создаст статическую библиотеку, если использовать параметр -static или all-static :

Примечания

Литература

Calcote, John (July 2010). Autotools : a practitioner’s guide to GNU Autoconf, Automake, and Libtool / by John Calcote (in english). No Starch Press. pp. 145 – 170. ISBN 978-1-59327-206-7. CS1 maint: Unrecognized language (link)

Источник

Утилита libtool

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

В нашем калькуляторе мы содержимое исходника calculate.c целиком включали в исполняемый файл. Следовательно, если мы захотим те же функции использовать в другой программе, мы должны писать их заново. Можно, конечно, воспользоваться широко известными командами Выделить-Копировать-Вставить. Но, всё равно, это – лишние телодвижения, лишнее увеличение в размерах исполняемого файла вследствие засорения его рутинными функциями. Да и самого исходника может не оказаться под рукой. А, может быть, я захочу внести в эти функции улучшение. Это значит, придётся переделывать все программы, в которых эти функции используются, чтобы во всех этих программах были новые версии функций. Нельзя ли, чтобы они находились где-нибудь в одном месте, и их можно было брать оттуда для всех программ, когда они понадобятся?

Как вы, наверное, догадываетесь, мы будем делать из исходника calculate.c библиотеку, которую потом будем подключать к исполняемой программе, полученной из одного main.c.

Итак, берёмся за очередную переделку нашего калькулятора.

Простейший способ создать библиотеку из файла calculate.c следующий:

gcc -c calculate.c

ar cru libcalculate.a calculate.o

Здесь gcc с флагом -c получает известный уже нам объектный файл, команда ar создаёт архив, в виде которых библиотеки и существуют. А команда ranlib генерирует индекс функций, содержащихся в библиотеке, и сохраняет этот индекс в её же файле. Эту процедуру всегда рекомендуется проделывать, поскольку индекс ускоряет процедуру связывания библиотеки с программой.

В дальнейшем этот файл можно вручную поместить в стандартный каталог библиотек (это /usr/lib и /usr/local/lib) и можно связывать её с помощью флага -lcalculate (обратите внимание, что название библиотек должно начинаться с префикса lib-).

Но понятно, что это нерациональный способ в отношении производительности труда. Давайте рассмотрим более практичные варианты. Для этого мы познакомимся с ещё одним компонентом набора инструментов GNU – libtool. Его предназначение – автоматизировать рутинные операции по работе с библиотеками и обеспечивать разработчику удобство при их написании и тестировании.

Создайте новый каталог проекта libtooldemo. Перенесите в него файлы calculate.c и main.c из C-версии калькулятора. Только обязательно удалите из каждого из них три строчки, требующие подключения заголовочного файла config.h. Пока мы пользоваться этим заголовочным файлом не будем.

Вышеуказанные строки должны быть удалены!

А что же файл calculate.h?

О нём особый разговор. Наша библиотека будет компилироваться компилятором C. Но вызываться она может и из программы,написанной на С++. А компилятор C++ имеет такую особенность – он изменяет названия функций при компиляции. Следовательно, название функции в вызывающей программе будет не совпадать с названием функции в библиотеке.

Чтобы избежать такой ситуации, надо в заголовочном файле, включаемом в код исполняемой программы явно указать, что библиотечная функция написана на C. Таким образом, наш новый заголовочный файл calculate.h будет выглядеть так:

float Calculate(float Numeral, char Operation[4]);

Давайте создадим подключаемую библиотеку из исходника calculate.c. Для этого вначале создадим объектный файл.

libtool gcc -c calculate.c

Посмотрите, что появилось в каталоге проекта. Это, во-первых, уже знакомый нам объектный файл calculcate.o. Во-вторых, это скрипт calculate.lo, сгенерированный утилитой libtool. Он будет указывать, как собрать библиотеку из объектных файлов. Больше ничего не видите? Тогда наберите:

Читайте также:  Системное администрирование linux с нуля

И вы обнаружите, что перешли во вложенный каталог .libs, который не виден в файловом менеджере, потому что по умолчанию в нём не видны все файлы и папки, названия которых начинаются с точки. В этом вложенном каталоге находится другая версия объектного файла calculate.o. Разница между ними в том, то один имеет позиционно-независимый код, а другой – позиционно-зависимый. Но позвольте пока не вдаваться в подробности об этом. Утилита libtool сама решит за нас, какой вариант лучше взять для формирования библиотеки при данной конфигурации системы.

Наконец сформируем саму библиотеку.

libtool gcc -rpath /usr/local/lib -o libcalculate.la calculate.lo

В проекте появился файл libcalculate.la. Это скрипт, который понадобится программе libtool. Сама же библиотека находится во вложенном каталоге .libs. Если вы туда зайдёте, вы обнаружите файл с расширением статической библиотеки libcalculate.a и файлы с расширением динамической библиотеки libcalculate.so (мы уже в своё время упоминали что эти типы библиотек имеют именно такие расширения файлов).

Содержимое файла libcalculate.a связывается с программой при компоновке, но библиотечных функций этот файл не содержит. Она содержит лишь ссылку на другой файл – libcalculate.so, который содержит библиотечные функции и связывается с программой динамически, то есть, по требованию в процессе выполнения программы.

Опция -rpath с указанием пути к стандартному каталогу библиотек указывает компоновщику, что необходимо создать библиотеку с динамическим связыванием, то есть предусмотреть оба – и a-файл и so-файл, и что они при инсталляции будут помещаться именно в тот каталог, который указан после -rpath. Путь к этому каталогу будет сохранён в a-файле, и именно по этому пути будет осуществляться поиск динамической библиотеки.

Можно указать компоновщику, что нужно создать статическую библиотеку. Для этого следует воспользоваться опцией -static.

libtool gcc -static -o libcalculate.la calculate.lo

Как вы видите, опции -rpath здесь нет. Она и не нужна, так как все библиотечные функции будут включены в исполняемый файл и нет необходимости что-либо откуда-либо вызывать динамически.

В каталоге .libs вы so-файла уже не найдёте, так как всё его содержимое включено в статически подключаемый a-файл.

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

libtool gcc -o kalkul main.c libcalculate.la -lm

Можно при желании сделать так, чтобы математические функции входили в нашу библиотеку. Для этого перекомпонуем её, с указанием обязательного включения libm.

libtool gcc -rpath /usr/local/lib -o libcalculate.la calculate.lo -lm

Тогда к исполняемой программе можно уже не подключать libm.

libtool gcc -o kalkul main.c libcalculate.la

Поскольку мы исполняемый файл kalkul формировали с помощью libtool, он также помещается в каталог .libs, а в каталоге проекта формируется скрипт с таким же названием kalkul. Но это не должно вас беспокоить. Эти скрипты создаются в целях обеспечения главного удобства libtool. Главное удобство в том, что она позволяет одновременно в одном каталоге работать и с исполняемыми программами и с необходимыми им библиотеками. Попробуйте запустить исполняемую программу. Программа без проблем найдёт и откроет библиотеку, хотя эта библиотека расположена не в системном каталоге. Это позволяет избежать лишнего обращения к системному каталогу на этапе разработки.

Она также даёт возможность одномоментно установить все файлы библиотеки в системный каталог. Давайте установим библиотеку libcalculate в каталог /usr/local/lib (предварительно зайдя от имени суперпользователя).

libtool cp libcalculate.la /usr/local/lib

Если при этой команде выдаются ошибки, просто повторите с начала всю процедуру компиляции и сборки библиотеки. Возможно, при каких-то манипуляциях вы потеряли некоторые вспомогательные файлы.

Обратите внимание, что установка должна осуществляться именно в тот каталог, который был указан в опции -rpath. В этот каталог будет скопирован не сам скрипт libcalculate.la, а статическая и динамическая библиотеки libcalculate.a и libcalculate.so.

Теперь также с помощью libtool сделаем по-новому исполняемый файл.

libtool gcc -o kalkul main.c -lcalculate

Скопируем его в системный каталог.

libtool cp kalkul /usr/local/bin

И вот здесь скорее всего многих из вас ждёт неприятный сюрприз – программа первый раз не запустится. Она выдаст сообщение:

error while loading shared libraries: libcalculate.so.0: cannot open shared object file: No such file or directory

То есть, линкер знает путь /usr/local/lib, а загрузчик динамических библиотек его не знает. Это свойство большинства современных дистрибутивов. Путь к загружаемым библиотекам придётся добавлять в систему вручную. Это ужасно неудобно. Человек, впервые столкнувшийся с этой проблемой, будет долго думать, в чём дело. Сделано так, вероятно, в целях безопасности, чтобы «левая» библиотека, случайно установленная невнимательным пользователем, не вступила в конфликт с системными библиотеками. Разумеется, вы должны очень подробно описать эту ситуацию для пользователя в файле README.

Добавим вручную нужный нам путь. Для этого надо задать системной переменной LD_LIBRARY_PATH значение /usr/local/lib (по умолчанию эта переменная в большинстве версий Linux вообще отсутствует).

Снова запускаем kalkul. Наконец-то он заработал!

Замести следы своих экспериментов можно следующим образом:

Источник

Оцените статью