Russian Qt Forum
Май 15, 2024, 16:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Последовательное динамическое связывание библиотек  (Прочитано 4665 раз)
andrew.k
Гость
« : Январь 30, 2015, 12:32 »

Во вложении тестовый проект. Проверял на линуксе.
У нас имеется библиотека core, которая собирается в динамическую libcore.so.
Далее вторая библиотека main, которая использует и динамически линкуется с libcore.so, и в свою очередь собирается в libmain.so.

Теперь у нас есть программа app. Которая использует libmain.so динамически.
Все это организовано в проект subdirs и отказывается собираться.

При сборке подпроекта app, получаются следующие сообщения об ошибке:
Код
Bash
/usr/bin/ld: warning: libcore.so.1, needed by ../bin/libmain.so, not found (try using -rpath or -rpath-link)
 
Хотя libcore.so успешно собрано и лежит рядом с libmain.so

Решается это двумя некрасивыми способами.

1. Слинковать дополнительно app с libcore (ключ -lcore).
Тогда все успешно собирается, при этом app становится слинкован с libcore.
Но это странное желание компилятора. Если библиотек много и много зависимостей, что их все высматривать и линковать в конечном приложении?

2. Собранную библиотеку libcore.so положить в системную директорию, например, /usr/lib
Тогда все успешно собирается, как и требовалось.
При этом после сборки, из системного пути библиотеку можно удалить.

И приложение успешно запускается из папки сборки.
Код
Bash
LD_LIBRARY_PATH=`pwd` ./app

То есть принципиально такая схема работает, но компилятор что-то не догоняет либо я.

Поэтому вопросы.

1. В чем принципиальная разница между этими схемами линковки библиотек?
2. Что мешает компилятору собрать проект без помещения библиотеки в системную директорию.
3. что такое -rpath и -rpath-link? как это может помочь и как это использовать?
gcc ругается, что такого ключа не знает.
« Последнее редактирование: Январь 30, 2015, 12:34 от andrew.k » Записан
andrew.k
Гость
« Ответ #1 : Январь 30, 2015, 18:59 »

Неужели совсем специалистов нет?  Подмигивающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #2 : Январь 30, 2015, 19:12 »

Добавьте в pro файл app:
QMAKE_RPATHDIR = ../bin
и все будет хорошо. Улыбающийся

В linux линкер, так же как и загрузчик, ищет библиотеки в определенных местах. ../bin в эти места не входит, поэтому ему нужно помочь.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #3 : Февраль 02, 2015, 12:32 »

2. Что мешает компилятору собрать проект без помещения библиотеки в системную директорию.
3. что такое -rpath и -rpath-link? как это может помочь и как это использовать?
gcc ругается, что такого ключа не знает.

2. Линкер не знает где искать, ему надо помочь: QMAKE_LFLAGS += -L/where/is/Lib/now
3. Опция линкера: -Wl,-rpath,/where/is/Lib/now/will/be

rpath будет удобен при отладке на машине девелопера т.к. либу он найдет, но на другой машине такого пути не будет, поэтому надо запускать через LD_LIBRARY_PATH=/where/is/Lib/now ./app

Записан
andrew.k
Гость
« Ответ #4 : Февраль 02, 2015, 19:11 »

Добавьте в pro файл app:
QMAKE_RPATHDIR = ../bin
и все будет хорошо. Улыбающийся

В linux линкер, так же как и загрузчик, ищет библиотеки в определенных местах. ../bin в эти места не входит, поэтому ему нужно помочь.


Че-то это не помогло совсем.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Февраль 02, 2015, 19:14 »

Че-то это не помогло совсем.
Странно.
А что пишет?
Записан
andrew.k
Гость
« Ответ #6 : Февраль 02, 2015, 19:40 »

2. Что мешает компилятору собрать проект без помещения библиотеки в системную директорию.
3. что такое -rpath и -rpath-link? как это может помочь и как это использовать?
gcc ругается, что такого ключа не знает.

2. Линкер не знает где искать, ему надо помочь: QMAKE_LFLAGS += -L/where/is/Lib/now
Если внимательно прочитать описание проблемы, то там описано, что линкер не видит только одну из двух либ, которые лежат в одной и той же директории.
При этом он ее не видит в том случае, когда ликовать ее не требуется.
А когда добавляешь -lmain сразу чудесным образом видит.

Отсюда понятно, что проблема не в этом.

3. Опция линкера: -Wl,-rpath,/where/is/Lib/now/will/be
Ничего из этого не помогло.

добавил
Код
C++ (Qt)
QMAKE_LFLAGS += -rpath
Получаю ошибку, что -rpath неизвестный ключ. Он почему-то передается компилятору.
« Последнее редактирование: Февраль 02, 2015, 19:49 от andrew.k » Записан
andrew.k
Гость
« Ответ #7 : Февраль 02, 2015, 19:51 »

Че-то это не помогло совсем.
Странно.
А что пишет?
Помогло, если собирать без Shadow Build.
Только опять же это не совсем то, что нужно.
В этом случае бинарник app слинковался с либой по прямому пути.
Поэтому для нормального релиза все равно придется собирать по-другому. Как описано выше.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #8 : Февраль 02, 2015, 20:06 »

А попробуйте эти переменные:
QMAKE_LFLAGS_RPATH
QMAKE_LFLAGS_RPATHLINK
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 23.