Во вложении тестовый проект. Проверял на линуксе.
У нас имеется библиотека 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 ругается, что такого ключа не знает.