crossplatform.ru

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

> Использование сторонних библиотек, Как использовать функции из .dll?
azure
  опции профиля:
сообщение 22.4.2010, 11:52
Сообщение #1


Студент
*

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

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




Репутация:   0  


Вопрос не столько по кросплатформенности, сколько по Qt + .dll в винде. Имеется девайс (pci-карта gpib) с драйверами и .dll + .h с функциями работы с устройством. dll идут под MS Visual C++ и Borland C++ Builder. Можно ли использовать эти .dll без использования вышеуказанных компиляторов? Конкретно интересует gcc/mingw? Если можно, то как?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 22.4.2010, 23:36
Сообщение #2


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

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

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




Репутация:   12  


ну вот тебе кусок из реального проекта. весь не привожу - там дохрена и файлов, и вызовов. но не важно.
(тут libftdi - библиотека драйвера для одной микросхемы)
Раскрывающийся текст

#include <dlfcn.h>


using namespace std;

typedef void* dll_handle_t;

typedef int (*ftdi_init_func_t)(struct ftdi_context *); // определения типов для точек входа библиотеки
...........
typedef void (*ftdi_deinit_func_t)(struct ftdi_context *);
class ftdidev_c
{
    public:
        ftdidev_c();
        ~ftdidev_c();

    protected:
        static dll_handle_t _dll;
        struct ftdi_context _ftdic;

        ftdi_init_func_t            pinit;   //་ указатели на функции, к которым динамически линкуются входы библиотеки
.....................
        ftdi_deinit_func_t          pdeinit;
    public:
        bool all_func_ok();
        int init();  // обёртка для вызова указателя на функцию
.........
        int deinit();
};


dll_handle_t ftdidev_c::_dll = dlopen("libftdi.so",RTLD_LAZY); // открытие хэндла библиотеки (без загрузки)

ftdidev_c::ftdidev_c()
{
    if(_dll != NULL)
    {
        pinit = (ftdi_init_func_t)dlsym(_dll,"ftdi_init");  // динамическая линковка точек в библиотеке к определённым внутри класса указателям на функции
.................................
        pdeinit = (ftdi_deinit_func_t)dlsym(_dll,"ftdi_deinit");
    }
    if(pinit != NULL)
    {
        (*pinit)(&_ftdic);
    }
}

ftdidev_c::~ftdidev_c()
{
    if(pdeinit != NULL)
    {
        (*pdeinit)(&_ftdic);
    }
}

bool ftdidev_c::all_func_ok()
{
    if(pinit == NULL) return false;
........................
    if(pdeinit == NULL) return false;
    return true;
}

int ftdidev_c::init()  // реализация обёртки для вызова указателя на функцию
{а на работе у меня
    if(pinit != NULL)
    {
        return (*pinit)(&_ftdic);
    }
    return FTDI_ERR_DLL_FUNC_UNDEFINED;
}


int ftdidev_c::deinit()
{
    if(pdeinit != NULL)
    {
        (*pdeinit)(&_ftdic);
        return FTDI_FUNC_OK;
    }
    return FTDI_ERR_DLL_FUNC_UNDEFINED;
}


(тут много дополнительных мелких ухищрений: просто у меня уже есть стандартизированный подход к работе с разными библиотеками и мне так привычнее. но не суть.)
вот это компилится без единого упоминания .a файла. линкуется с dl (ну там ещё rt и pthread, но это не существенно для примера).
я и libftdi.а и libftdi.la убрала вообще из /usr/lib и больше их нет нигде и доступа к ним нет вообще - они под рута убраны. остались только libftdi.so файлы.
однако, компилится и рекомпилится с нуля - будь здоров! потому что для работы с .so нужны только имена точек входа и имя самой .so библиотеки.

и это у меня не один проект, а куча разных проектов, для разных девайсов. аналогично и под вендой на работе. там те же самые девайсы, те же библиотеки. и всё собирается без статики.
такой же модуль под венду для этой железяки также динамически через вендозные функции грузит точки входа. я на память не вспомню как в венде вызываются загрузка и линковка входов, но всё совершенно аналогично. и .lib там тоже не нужен.

Сообщение отредактировал Iron Bug - 22.4.2010, 23:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.4.2010, 6:29
Сообщение #3


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Мы говорим про венду! Посмотри внимательно, что какие файлы генерируются вместе с dll. dll нельзя слинковать с exe.

Сообщение отредактировал BRE - 23.4.2010, 6:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- azure   Использование сторонних библиотек   22.4.2010, 11:52
- - Litkevich Yuriy   Цитата(azure @ 22.4.2010, 15:52) Можно ли...   22.4.2010, 12:16
|- - azure   Спасибо за подробные указания. Как узнать, сделана...   22.4.2010, 12:29
- - Litkevich Yuriy   Цитата(azure @ 22.4.2010, 16:29) "по...   22.4.2010, 12:58
- - Влад   Посмотри экспорты этой DLL (например, утилитой Dep...   22.4.2010, 13:00
- - Tonal   Можно использовать dll-ку собранную одним компилят...   22.4.2010, 13:03
- - Litkevich Yuriy   Цитата(Влад @ 22.4.2010, 17:00) Если в эк...   22.4.2010, 13:40
- - Iron Bug   Цитата(Litkevich Yuriy @ 22.4.2010, 16:40...   22.4.2010, 14:39
- - Litkevich Yuriy   я имел в виду "возможно ли на этапе компиляци...   22.4.2010, 15:49
|- - azure   Цитата(Litkevich Yuriy @ 22.4.2010, 15:49...   22.4.2010, 16:08
- - Litkevich Yuriy   Цитата(azure @ 22.4.2010, 20:08) .lib (эт...   22.4.2010, 16:12
|- - BRE   Цитата(Litkevich Yuriy @ 22.4.2010, 17:12...   22.4.2010, 16:18
- - Litkevich Yuriy   ага, т.е. если у меня в распоряжении только dll...   22.4.2010, 16:38
|- - BRE   Цитата(Litkevich Yuriy @ 22.4.2010, 17:38...   22.4.2010, 16:47
- - Iron Bug   люди, у меня такое ощущение, что у вас в голове си...   22.4.2010, 20:23
|- - BRE   Цитата(Iron Bug @ 22.4.2010, 21:23) а то ...   22.4.2010, 20:36
- - Iron Bug   Цитата(BRE @ 22.4.2010, 23:36) А мы про в...   22.4.2010, 20:43
|- - BRE   Цитата(Iron Bug @ 22.4.2010, 21:43) принц...   22.4.2010, 20:48
- - Iron Bug   Цитата(BRE @ 22.4.2010, 23:48) Разве. с т...   22.4.2010, 21:41
- - BRE   венда/линукс под рукой есть? Сделай небольшой прим...   22.4.2010, 21:45
- - Iron Bug   ну вот тебе кусок из реального проекта. весь не пр...   22.4.2010, 23:36
|- - BRE   Мы говорим про венду! Посмотри внимательно, чт...   23.4.2010, 6:29
- - Litkevich Yuriy   Цитата(BRE @ 23.4.2010, 10:29) dll нельзя...   23.4.2010, 8:27
|- - BRE   Цитата(Litkevich Yuriy @ 23.4.2010, 9:27)...   23.4.2010, 8:57
- - Tonal   В винде не все линкеры умеют пользоваться символам...   23.4.2010, 9:02
- - Iron Bug   Цитата(BRE @ 23.4.2010, 9:29) Мы говорим ...   23.4.2010, 11:56
- - BRE   Iron Bug, ты все динамические библиотеки загружаеш...   23.4.2010, 12:21
- - Iron Bug   Цитата(BRE @ 23.4.2010, 15:21) Iron Bug, ...   23.4.2010, 13:52
|- - BRE   Цитата(Iron Bug @ 23.4.2010, 14:52) и нев...   23.4.2010, 14:07
- - Iron Bug   Цитата(BRE @ 23.4.2010, 17:07) А кто прик...   23.4.2010, 14:29
|- - BRE   Цитата(Iron Bug @ 23.4.2010, 15:29) я зна...   23.4.2010, 14:46
- - Iron Bug   я вообще-то изначально отвечала на исходный вопрос...   23.4.2010, 17:57
|- - Tonal   Цитата(Iron Bug @ 23.4.2010, 21:57) ну ту...   26.4.2010, 7:48
- - Litkevich Yuriy   Тему разделил: Сборка библиотеки под ОС Symbian   23.4.2010, 20:48


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


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




RSS Текстовая версия Сейчас: 26.11.2024, 9:09