Общий порядок компиляции + как узнать версию библиотеки

Модератор: Модераторы разделов

bdimych
Сообщения: 46

Общий порядок компиляции + как узнать версию библиотеки

Сообщение bdimych »

MOPSLinux 5 = Slackware 11

Я начинающий но уже продвинутый. Не могу сообразить принципы стандартной сборки приложения linux.

Вопросы возникли при попытках сборки vlc player. Это здоровенный можно сказать мультимедийный фрэймворк. Чтобы его собрать нужно ~30 других пакетов которые и между собой тоже связаны. Там есть автоматизация сборки всех нужных пакетов, но с первого раза не получилось. Процесс несколько раз стопорился и в каждом случае приходилось вручную разбираться с несобирающимся пакетом. И когда он наконец таки собрался, заработал тоже не сразу. Пришлось пересобирать несколько раз а на каждую пересборку не меньше 40 минут уходило. Я злился!

Не могу сообразить порядок вообще т.е.
1. autotools делают файлы Makefile и configure
2. gcc и g++ собирает файлы "o" из файлов c/cpp + h/hpp
3. ??? собирает из нескольких "o" файл "a"
4. ??? из "a" делает файл "so"

Статическая сборка - это включение кусков кода из одного "o" в другой ?

Где определяется что программа будет не статической а использовать "so" и какие ? Т.е. например пакет ffmpeg у меня уже есть в /usr/local. Сборочный скрипт vlc качает ffmpeg в свой подкаталог и как быть уверенным что при сборке будет использоваться именно скаченная версия

Что делает ldconfig? Т.е. не может ли он тоже повлиять на то какая версия ffmpeg будет использоваться. Ведь ldconfig при каждой загрузке запускается и что то связывает.

Как узнать версию файла "a" или "so" и вообще понятие версия библиотеки в линуксе что означает. Я виндузятник поэтому о версии представление такое - "правой кнопкой - свойства файла". Пробовал readelf но он выдает нечто большое которое явно не совпадает просто с цифрой в имени файла после "so". Эта цифра как я понимаю и есть версия? Но внутри файла версии нет что ли ? А у файлов "a" где тогда версия ?

я примерно знаю что надо читать: elf + libtool + ld + ldconfig + флаги -L -I -l но как говорил Киса Воробьянинов хочется чтобы побыстрее :) Если не трудно объясните пожалуйста в двух словах.
Спасибо сказали:
Аватара пользователя
alastor
Сообщения: 844
Статус: ARCH'еноид
ОС: Arch Linux current

Re: Общий порядок компиляции + как узнать версию библиотеки

Сообщение alastor »

ээээ....
А ./configure && make && make install уже отменили чтоль?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Общий порядок компиляции + как узнать версию библиотеки

Сообщение v04bvs »

Есть исходник на C (или C++).

Компилятор его транслирует в машинный код с относительной адресацией. Этот машинный код сохраняется в объектных модулях (расширение .o или .obj).

Если необходима статическая библиотека - множество объектных модулей архивируются в один файл. Обычно у него расширение .a и его называют статической библиотекой. На самом деле это самый обычный архив, который делается утилитой ar. Его особенность в том, что его "на лету" умеет распаковывать gcc.

Если необходима динамическая библиотека - множество объектных модулей собираются с помощью редактора связей (линковщика) в динамическую библиотеку.

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

Статическая сборка - это включение кусков кода из одного "o" в другой ?

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

Где определяется что программа будет не статической а использовать "so" и какие ?

На этапе работы редактора связей. Конкретные имена бибилиотек передаются в качестве параметров.

Т.е. например пакет ffmpeg у меня уже есть в /usr/local. Сборочный скрипт vlc качает ffmpeg в свой подкаталог и как быть уверенным что при сборке будет использоваться именно скаченная версия

Обычно редактор связей запускается не напрямую (командой ld) а через более удоный интерфейс gcc. В этом случае необходимо проверить, что ему передаётся каталог с динамическими билиотеками опцией -L
Но, вообще говоря, в заголовке исполняемого файла записано только базовое имя динамической библиотеки (например libc.so.6). При запуске приложения загрузчик будет искать все библиотеки и подставлять полные пути. Какие конкретно будут использоваться - можно узнать командой ldd. Список каталогов для поиска можно менять модифицируя переменную LD_LIBRARY_PATH. Подробнее можно почитать в man ld

Как узнать версию файла "a" или "so"

В общем случае - никак. Потому что понятия "версия" у библиотеки нет.
Обычно с версиями работают следующим образом:
к примерну у меня есть такие файлы

Код: Выделить всё

/usr/lib/libfreetype.so
/usr/lib/libfreetype.so.6
/usr/lib/libfreetype.so.6.3.8

Это значит, что у меня в система есть библиотека freetype, библиотека freetype версии 6 и библиотека freetype версии 6.3.8 (на самом деле это всё - один и тот же файл)
Если при сборке приложения указана библиотека freetype - будет использоваться /usr/lib/freetype.so
Если же указать freetype-6.3.8, будет выполнена привязка к конкретной версии 6.3.8, и при её отсутствии приложение не будет запускаться.

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

Re: Общий порядок компиляции + как узнать версию библиотеки

Сообщение bdimych »

v04bvs большое спасибо.

Господа модераторы куда плюсик ставить ?
Спасибо сказали: