Здравствуйте.
Возникла такая вот задача (точнее, незадача).
Есть программа, состоящая из статически слинкованных (в разном порядке, в зависимости от настроек) статических же библиотек-компонент и функции main.
Программа должна уметь подгружать DLL на лету ну и так далее.
Прелесть в том, что ДЛЛи должны использовать код, который лежит в программе, состоящей из статически слинкованных компонент (предвосхищая вопрос — да, действительно лежит, я проверял).
Я ожидал, что оно заработает из коробки — но по факту получилось не так:
"Cannot load library /path/to/plugin/libplugin.so: (...plugin.so: undefined symbol: _ZN5app4namespace10AppClass12staticFunctionElPKcS3_S3_)"
т.е. при включении в ДЛЛ кода, который вызывает функции, которые физически должны распологаться в программе, загружающей ДЛЛ — появляется такое вот сообщение при загрузке.
Немного технических деталей:
таргет-система — линукс
в качестве инструмента загрузки используется QLibrary из Qt (успешно загружает ДЛЛ, в которых нет обращения к коду из программы)
пробовал флаги QLibrary::ResolveAllSymbolsHint, QLibrary::ExportExternalSymbolsHint — не помогло, QLibrary::LoadArchiveMemberHint — не пробовал, вроде, не о том
Собственно, вопрос такой: как заставить всё это работать, крайне желательно — по описанной выше схеме?
Спасибо.
Здравствуйте, cheqa, Вы писали:
C>Собственно, вопрос такой: как заставить всё это работать, крайне желательно — по описанной выше схеме?
предположу, что проблема в visibility ненайденного символа
ссылка по теме:
http://stackoverflow.com/questions/1500689/dynamic-linking-woes-using-c
цитата:
You need to use the linker option "export-dynamic" when compiling your main executable.
Normally, the main executable won't export its symbols for use by the dynamic linker (unless the symbol is used by some shared library participating in the link), which means that if your library calls back into the main exe, it will fail to load.
Здравствуйте, uzhas, Вы писали:
U>предположу, что проблема в visibility ненайденного символа
U>ссылка по теме: http://stackoverflow.com/questions/1500689/dynamic-linking-woes-using-c
U>цитата:
U>U>You need to use the linker option "export-dynamic" when compiling your main executable.
U>Normally, the main executable won't export its symbols for use by the dynamic linker (unless the symbol is used by some shared library participating in the link), which means that if your library calls back into the main exe, it will fail to load.
Спасибо за совет. Но, если я всё сделал правильно — не работает. Хотя странно...
Здравствуйте, cheqa, Вы писали:
C>Спасибо за совет. Но, если я всё сделал правильно — не работает. Хотя странно...
можно еще проверить флаги у dlopen
http://stackoverflow.com/questions/3004318/dynamic-loaded-libraries-and-shared-global-symbols
Здравствуйте, uzhas, Вы писали:
U>можно еще проверить флаги у dlopen
U>http://stackoverflow.com/questions/3004318/dynamic-loaded-libraries-and-shared-global-symbols
Мне почему-то кажется, что ваш совет правильный — но у меня пока не получается. Возможно, виной тому cmake & qt. Надо будет попробовать собрать из командной строки.
А при компиляции объектников никаких особых флагов не надо выставлять?
Здравствуйте, uzhas, Вы писали:
U>можно еще проверить флаги у dlopen
U>http://stackoverflow.com/questions/3004318/dynamic-loaded-libraries-and-shared-global-symbols
В общем, пока не понятно.
Переделал всё на динамическую линковку — теперь обычные символы находятся, ругается, что не может найти staticMetaObject объектов Qt из неродного адресного пространства. Это грустно, да.
При статической сборке — ошибка та же самая, не может найти символы.
Наверное, придётся просто смириться.