2015-01-07 2 views
0

У меня очень сложная группа библиотек и исполняемых файлов (Linux). Вся система была разработана с использованием статических библиотек в прошлом, а затем пару лет назад библиотеки были перенесены на разделяемые библиотеки (-fPIC и т. Д.). Проверка зависимостей я узнал, что есть два общие ЛИЭС: Либ и libB:Построение общих библиотек, которые зависят друг от друга (Linux)

  • Lība вызывает некоторые функции из libB
  • libB вызывает некоторые функции из Либа

Я хотел бы построить libs, имеющие соответствующие зависимости: libA зависит от libB, а libB зависит от libA. Но я не могу дать «-llibB» компоновщику, потому что lib еще не существует во время сборки libA

Если я создаю libA без зависимости libB (создавая неразрешенные символы), я должен поддерживать в виду, если я использую libA, мне также нужно связать libB из-за неопределенных символов в libA. Это просто!

Что я ищу, это возможность построить libA и сообщить компоновщику, чтобы создать зависимость от libB БЕЗ без libB в это время, возможно ли это?

Как я могу решить свою проблему без объединения libA и libB вместе?

С уважением, Петерс


Edit: я узнал, что я могу напрямую генерировать пустой LIB (без написания исходного кода):

gcc -shared -Wl,-soname,libB.so.$(MAJOR) -o libB.so 

то я могу build libA добавляет: -lB к команде сборки. После этого я удалил libB.so. Наконец, после установки libB ссылается на libA, а libA ссылается на libB.

Конечно, MAJOR номер должен соответствовать MAJOR libB, это так, потому что основное число является общим для всех libs.

Я просто спрашиваю себя, есть ли более подходящий способ сделать это?

+0

Я считаю, что это ошибка дизайна. 'libA.so' и' libB.so' должны быть * объединены * в один 'libAB.so' –

+0

Нет, они могут жить независимо друг от друга. Ниже мой ответ. –

+0

Возможно, они могут «быть независимыми», но не должны (поскольку на самом деле они оба зависят от другого). –

ответ

2

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

gcc -shared -Wl,-soname,libA.so.$(AMAJOR) -o libA.so 
gcc -shared -Wl,-soname,libB.so.$(BMAJOR) -o libB.so 

, а затем

gcc -o myProgram a.o b.o c.o libA.so libB.so 

при загрузке (запустить) MyProgram, то динамический загрузчик будет следовать неудовлетворенным зависимостям и искать символы в обоих общих объектах. Опция -shared на самом деле является флагом non-complaints-about-unresolved-symbols, который позволяет создавать ELF-файл без всех разрешенных символов.

Другое, что может случиться здесь, состоит в том, что в либрах нет . Вы пытаетесь выполнить их без правильных путей и получить неразрешенные символы (из myProgram) при его выполнении.Одним из решений является запуск MyProgram с:

LD_LIBRARY_PATH=. myProgram 

или

export LD_LIBRARY_PATH=/path/to/libraries 
myProgram 

В Linux, библиотеки кэшируются в базе данных системы, поэтому загрузка разделяемых библиотек быстро. База данных индексируется игнорирован, и чтобы восстановить базу данных, вы должны использовать команду LDCONFIG (8) как корень

ldconfig 

Другие среды не могут использовать LDCONFIG (8) на всех (Солярис быть примером)

Смежные вопросы