Russian Qt Forum
Ноябрь 22, 2024, 14:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: dylib (dll) - туда и обратно  (Прочитано 2537 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Январь 03, 2015, 10:35 »

Добрый день

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

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

Спасибо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 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 это не так.

В общем, "так защищаться можно"  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.064 секунд. Запросов: 22.