Столкнулся с такой, новой для себя, проблемой. Есть проект построеный по модульной архитектуре. Есть главный бинарник (App), главная динамическая библиотека (A.so) и отдельный модуль (B.so).
Библиотека A.so линкуется с разными сторонними динамическими диблиотеками, типа boost, ssl, crypto. В исходных кодах A.so описываются всякие скущности которые ссылаются на эти сторонние библиотеки.
Основной бинарик App линкуется с A.so и использует только одну маленькую функцию из этой библиотеки. Т.е. не используется ничего связанного с ssl,cryprto, boost и прочим.
Модуль B.so использует сущности связанный с boost,ssl,crypto но не линкует сторонние библиотеки.
Во время сборки всего это получается такая хрень. Так как App не использует явно функции,объекты и прочее определенные в A.so и связанные с boost,ssl,crypto то они тупо отбрасываются линковщиком и их нет ни в зависимостях ни у App ни у A.so.
Далее App через dlopen загружает B.so (который нуждается в boost,ssl,crypto) и, о боже, ни у кого не оказывается этих зависимостей, и я получаю unresolved symbols.
Вопрос, как разрешить эту спорную ситуацию. Проблема усугубляется еще тем что на системе redhat этой проблемы не возникает, и все нужные зависимости оказываются в A.so и также гладко качуют в App, B.so (при ее загрузке). А в ubuntu все не используемые зависимости просто отбрасываются из A.so и из за этого наступает невозможность загрузить B.so который нуждается в этих зависимостях.
Еще раз повторюсь, boost,ssl,crypto используются в исходных кодах динамически загружаемой библиотеки A.so и у нее же в правилах написано линковаться с ними. Но так как это - динамически загружаемая библиотека, то понятно дело они только определяются там, но не используются явно (т.е. не создаются объекты, не вызываются функции). И они отбрасываются и либа не резолвит все используемые в ней сторонние зависимости.