crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Динамические библиотеки, Как кросплатформаено пользоваться библиотекой
alexy
  опции профиля:
сообщение 4.8.2010, 18:29
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток :)

Для моего проекта самое лучьшее решение - это использовать одну библиотеку динамческую и несколько приложений, которые ею бы пользовались. В ней должны быть несколько диалогов, классы, реализующие сущности программы (эти классы читают данные из базы данных SQLite). Для всего этого я пользуюсь code::blocks'ом, ну и соответственно wxwidgets

Вопрос: можно ли создать один проект в нем, чтобы просто компилть его на разных платформах и все было бы путем (в линукс на сколько я понимаю никаких __declspec(dllimport) нет)? И как классы загружать при помощи wxdynamiclibrary?

У меня кстати почему-то не получается создать библиотеку нормальным путем. Если выбираю при создании проекта динамическую бблиотеку, то при использовании в ней wxwidgets она перестает компилится. нужно только гуи приложение создать, а потом в билдтаргатах переделать что она мол библиотека.

Помогите, плиз. Давно мучаюсь, ничего не могу сделать. в инете на эту тему почти ничего нет :( как буд-то никто с этими библиотеками не работает :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 4.8.2010, 20:59
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1587
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


Использую тот же набор софта. У меня не удавалось создать совсем уж прямо один проект для линя и венды (именно по причине импорта библиотек). Но можно задать конфигурации - например Debug Linux, Release Linux, Debug Windows, Release Windows (в Codeblocks настройки разных компиляций проекта легко наследуются и копируются) и таким образом иметь единый набор файлов и почти что единый проект.
Насчёт библиотеки: в wxWidgets по дефолту подключается собственный модуль с main. Его можно отключить - см. макрос IMPLEMENT_APP_NO_MAIN() в доках по wxWidgets. Могу найти пример кода, который реализует свою точку входа (main) для wxWidgets. Думаю, что библиотека реализуется также, просто без main, но возможно, что потребуется какая-то дополнительная инициализация wxApp.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexy
  опции профиля:
сообщение 5.8.2010, 14:56
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


А как посоветуете быть с заголовочными файлами? На цинде нужно писать __declspec(dllexport) (import) а на линуксе не надо. Если создать несколько бил таргетов и к каждому прикрепить свой заголовочный файл, то возникнет проблемма с добавленем функций :)

Если я правильно понял, то, при старте программы, написанный с использованием виджетов, она в main подключает модуль wxwidgets? И этот модуль мешает подключить другую библиотеку, в который есть виджеты? но она даже не компилиться на лине, на винде можно перенести все настройки билттаргета и все заработает

Может быть было опыт когда погдужаешь формочку с библиотеке. я что-то не очень хорошо понимаю как это сделать. Нужно просто класс импортировать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 5.8.2010, 16:13
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1587
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


для __declspec и прочими такими некроссплатформенными префиксами совершенно стандартно пишется макрос с ifdef'ами для каждой оси, а затем он везде юзается.

насчёт подгрузки wxwidgets - зависит от сборки. можно линковать динамически. смотря как планируется использовать wxWidgets. в любом случае, система при подгрузке библиотеки слинкует все требуемые для неё точки входа. насчёт "не компилится на лине" - не могу ничего сказать без конкретного кода.

мне никогда не требовалось грузить формы из библиотеки. я вообще мало работаю с графикой и в основном использую динамический генератор xrc форм, мне так проще. но у меня редко требуется сложный интерфейс, так как я в основном железом занимаюсь. теоретически, полагаю, что для библиотеки собирается модуль без main, со своими экспортируемыми объектами и функциями, со стандартными для библиотеки функциями инициализации и выхода и с внешними линками к wxWidgets. а основной модуль уже как обычно имеет стандартный вход и линкует wxwidgets динамически, либо содержит его в себе. может, попробую пример написать, если время будет свободное. думаю, что это несложно.
про разные виды линковки под линём можно почитать тут, к примеру: http://www.yolinux.com/TUTORIALS/LibraryAr...AndDynamic.html


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexy
  опции профиля:
сообщение 6.8.2010, 16:34
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 4.8.2010
Пользователь №: 1931

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо

Вообще везде пишут, что можно написать функцию в нутри библиотеке, которая просто вернет указатель на новый, созданный объект, и тогда надо импортировать только её. Ну я сразу подумал, что тогда можно реализовать таким образом оператор new. А потом подумал, что вообще - пишешь класс, в конце пишешь макрос, который создает на основе шаблона и загружающюю для него функцию и нужный оператор new. Таким образом можно было бы совершенно прозрачно использовать класс из динамической библиотеки. И, конечно, этот макрос может определять и платформу и соответственно генерить класс, чтобы не было проблемм с таблицей импорта (__declspec)

Наверное мне не одному такая идея в голову пришла: может такое уже реализованно где-то? В бусте я ничего не нашел для работы с библотеками а в виджетах просто какой-то класс, который позволяет загружать функции из нее, но такого нет :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 6.8.2010, 19:36
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1587
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


Статья в википедии wxWidgets на эту тему:
http://wiki.wxwidgets.org/Creating_A_WxWidgets_DLL_In_Linux
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.10.2019, 13:53