Динамические библиотеки, Как кросплатформаено пользоваться библиотекой |
Здравствуйте, гость ( Вход | Регистрация )
Динамические библиотеки, Как кросплатформаено пользоваться библиотекой |
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
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 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
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 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
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Статья в википедии wxWidgets на эту тему:
http://wiki.wxwidgets.org/Creating_A_WxWidgets_DLL_In_Linux |
|
|
Текстовая версия | Сейчас: 22.11.2024, 6:19 |