Как ни странно, такое свинство работает на OSX (наверное на др nix ОС тоже)
1) Ставим либе опцию линковки
-undefined dynamic_lookup
После этого она прекрасно "собирается" всегда
2) Линкуем ее к приложению (weak необязательно) и запускаем. Лоадер выдает ошибку типа
dyld: Symbol not found: __ZN8MyStringShowEv
Referenced from: /Volumes/../MyLib.dylib
Expected in: flat namespace
Теперь именно этот символ (__ZN8MyStringShowEv) вписываем в exp файл приложения. Следующий символ - и так до тех пор пока не запустится. При этом класс MyString должен иметь атрибут visibility("default"), иначе линкер не будет его экспортировать.
Конечно плохо что приходится добавлять много символов руками и корректировать если что-то изменилось в приложении. Но радует что не нужна переделка исходников. Как лучше - хз. Поизучал Q_DECL_IMPORT/Q_DECL_EXPORT, они на OSX сводятся к тому же
__attribute__((visibility("default")))
Наверное (я так думаю) для dylib если эта видимость установлена - то автоматом экспорт. Но для application это не так.
В общем, "так защищаться можно"