Russian Qt Forum

Компиляторы и платформы => Mac OS X => Тема начата: Igors от Январь 03, 2015, 10:35



Название: dylib (dll) - туда и обратно
Отправлено: Igors от Январь 03, 2015, 10:35
Добрый день

Вопрос типа "забыл - ну или никогда не знал  :)". Есть часть кода привязанная к старому SDK которую я не могу быстро портировать на новый. Я хочу свалить эту часть в dylib и спокойно делать остальное на новом. Но тут вылазит такое, пример
Код
C++ (Qt)
void MyOldClass::SomeMethod( const MyString & );
Да, я хочу поместить класс MyOldClass в dylib, но класс MyString должен быть в основном приложении. Ну а dylib конечно не собирается, линкер вякает на MyString. Шо делать?

Ну и вообще неясно, а пройдет ли так (подхватится ли dylib) если SDK разные?

Спасибо


Название: Re: dylib (dll) - туда и обратно
Отправлено: Igors от Январь 05, 2015, 11:39
Как ни странно, такое свинство работает на 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 это не так.

В общем, "так защищаться можно"  :)