Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кроссплатформенная разделяемая библиотека  (Прочитано 12422 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 13-03-2010 17:07 » 

Нужен совет.

Собрался написать разделяемую библиотеку под Linux, но есть задумка сделать ее кроссплатформенной. Меня вполне устроила бы совместимость только с платформами POSIX/GCC и Win32/VC++.

Библиотека будет загружаться и выгружаться многопоточным приложением.
Сколько копий этого приложения будет на машине - не известно.
Нужно отработать инициализацию и деинициализацию общих данных процесса.

С POSIX все просто: init() и fini(), а память данных у каждого процесса своя.
С Win32/VC++ я DLL не писал (только в BCB6).

Код:
#ifdef  __cplusplus
extern "C" {
#endif

#include "my_struct.h"

void lib_init(void);
void lib_fini(void);

my_struct_t *my_struct;


/* System library interface */

#ifdef __WIN__
#include <windows.h>

BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved);
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            lib_init();
            break;
        case DLL_PROCESS_DETACH:
            lib_fini();
            break;
    }

    return TRUE;
}

#else /* POSIX */

void __attribute__ ((constructor)) _init(void)
{
    lib_init();
}

void __attribute__ ((destructor)) _fini(void)
{
    lib_fini();
}

#endif /* WIN/POSIX */


/* Library init/deinit */

static void lib_init(void)
{
    my_struct = (my_struct_t*)malloc(sizeof(my_struct_t));
}

static void lib_fini(void)
{
    free(my_struct);
}


#ifdef  __cplusplus
}
#endif

Такой вариант имеет право на жизнь?
« Последнее редактирование: 13-03-2010 17:13 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 15-03-2010 04:41 » 

Нормальный вариант, только:
1. я бы сделал 3 разных типа файла (довольно стандартная практика насколько я заметил)
1.1 каталог с реализацией для винды, туда пихаем DllMain (файл Win32/init.cpp) и прочее platform specific
1.2. каталог для linux, туда пихаем init/fini (файл Linux/init.cpp) и прочее platform specific
1.3. общий код, туда lib_init/lib_fini (файл Linux/common.cpp)
это избавит от необходимости рисовать не красивые файлы с кучей дефайнов
2. по максимуму использовал бы сторонние библиотеки (boost/stlport/tbb), что бы писать минимум platform specific кода (синхронизация/IPC/file/socket)
Записан

Странно всё это....
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 15-03-2010 08:10 » 

Абсолютно согласен с LogRus по поводу разных каталогов и некрасивых файлов с кучей дефайнов. Так и писать проще и читать.

По поводу сторонних библиотек. Это такой краеугольный камень. Если напишешь код, на API, то под другую версию ОСи может быть придется кое-что переписать (совсем не факт, а только может быть). А напишешь с библиотекой, будешь зависеть от нее, а ее тоже люди пишут.

Вообще это всё хорошо, но реально всё зависит от назначения создаваемой библиотеки. Может тут ни API, ни сторонних библиотек не потребуется, и все эти разговоры пустые.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-03-2010 09:54 » 

Ну, STL удобен со своими коллекциями, а ввод-вывод надежнее использовать системный.
Т.к. у меня нечто вроде плагина, то нужна надежность, чтобы не привести к крешу основной программы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 15-03-2010 10:23 » 

Ну STL то понятное дело. Ее даже сторонней и не назовешь никак.
А ввод/вывод разный бывает. Всмысле если просто с файлами работа (прямая и безхитростная), то и сишная библиотека  вполне пойдет.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 15-03-2010 19:11 » 

resource, кстати, очень даже назовешь! C++ тянет за собой большой CRT - Си скромнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 15-03-2010 19:38 » 

Ну я как-то думал, что STL - стандартная часть C++. Всмысле вполне ANSI C/C++. Всмысле реализация ее, для любого компилятора, поддерживающего стандарт, одинакова. Я ошибаюсь?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 15-03-2010 21:04 » 

resource, я совсем о другом говорю.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 15-03-2010 21:56 » new

Ну я как-то думал, что STL - стандартная часть C++. Всмысле вполне ANSI C/C++. Всмысле реализация ее, для любого компилятора, поддерживающего стандарт, одинакова. Я ошибаюсь?
Реализаций много. Поведение должно быть одинаковое - в смысле, стандартное. Да и то, по-всякому случается. Microsoft долго к стандартному приводили, например.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 16-03-2010 07:37 » 

Ребята, я о другом: если я напишу DLL на C++, то она ведь включит в свой состав run-time блок C++. Правильно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 16-03-2010 08:03 » 

Вад, реализаций действительно много, так же как и самой CRT Lib.
RXL, ну тут и к гадалке не ходи. Ну и что плохого?
« Последнее редактирование: 16-03-2010 08:05 от resource » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 16-03-2010 08:04 » 

По идее, да. Если ты сам не примешь мер против того, чтобы она его включила.

В любом случае, dll ведь для каждой платформы должны иметь свой формат - так?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines