crossplatform.ru

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

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Использование сторонних библиотек, Как использовать функции из .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? Если можно, то как?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.4.2010, 12:16
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(azure @ 22.4.2010, 15:52) *
Можно ли использовать эти .dll без использования вышеуказанных компиляторов? Конкретно интересует gcc/mingw? Если можно, то как?
если dll создана по "всем правилам", то можно с помощью MinGW использовать dll'ку созданную MS Visual C++.

Делается всё по аналогии со сборкой драйвера FireBird (QIBase).



сделай pri-файл, для внешней библиотеки, положи его в её корень.
Предположим, что заголовочник лежит в каталоге include
lib-файл в каталоге lib
и библиотека называется name.lib (name.dll, соответсвенно)
тогда pri-файл должен выглядеть так
INCLUDEPATH +=    $$PWD/include
QMAKE_LIBDIR += $$PWD/lib
LIBS += -lname

подключи этот pri-файл в свой файл проекта:
include(path/to/lib.pri)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
azure
  опции профиля:
сообщение 22.4.2010, 12:29
Сообщение #3


Студент
*

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

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




Репутация:   0  


Спасибо за подробные указания. Как узнать, сделана ли .dll "по всем правилам" или нет?
Я тут погуглил, люди говорят что длл бывают обычные и "расширенные". Обычные типа очень совместимые со всем, а расширенные имеют некую специализацию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.4.2010, 12:58
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(azure @ 22.4.2010, 16:29) *
"по всем правилам" или нет?
этого я и сам не знаю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 22.4.2010, 13:00
Сообщение #5


Участник
**

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

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




Репутация:   8  


Посмотри экспорты этой DLL (например, утилитой Depends.exe или любой другой).
Если в экспортах "простые читаемые" имена типа OpenDevice и т.п., то DLL скорее всего "простая", написанная по всем правилам.
Если же в экспортах загадочные имена типа ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ, то все совсем не так радужно :) - другой компилятор такую DLL скорее всего не поймет; а если и поймет, то не факт, что сможет с ней правильно работать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 22.4.2010, 13:03
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Можно использовать dll-ку собранную одним компилятором в другом если она удовлетворяет следующему набору условий:
* dll-ка экспортирует чисто С-шные функции.
* из неё не вылетает исключений.
* структуры содержат только примитивные данные или другие такие же структуры.
* структуры передаются только по указателям.
* память, выделенная в dll-ки в ней же и освобождается.
* dll-ка не пытается освободить память выделенную приложением.
* не используются зависимые от компилятора соглашения о вызовах.
* не используются зависимые от компиляторов расширения dll-ек (типа пакетов от багланда).
Уф, вроде всё. :)

Если какие-то из этих требований будут нарушены, то нужно смотреть по месту...

Да, маленький бонус: полностью абстрактные структуры (интерфейсы) использовать можно. :)

Сообщение отредактировал Tonal - 22.4.2010, 13:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.4.2010, 13:40
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Влад @ 22.4.2010, 17:00) *
Если в экспортах "простые читаемые" имена типа OpenDevice и т.п.,
Да к стати сейчас заглянул в fbclient_ms.dll
и увидел чистенькие имена gds_describe ...
Прикрепленное изображение


А вот такой вопрос lib-файлы обязательны? Возможно ли линковка без них, если dll'ка простая?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.4.2010, 14:39
Сообщение #8


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

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

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




Репутация:   12  


Цитата(Litkevich Yuriy @ 22.4.2010, 16:40) *
А вот такой вопрос lib-файлы обязательны? Возможно ли линковка без них, если dll'ка простая?

конечно. подгружаешь, линкуешь методы - и вперёд. собственно, это и есть динамическая загрузка библиотеки. нужны только имена точек входа.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.4.2010, 15:49
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


я имел в виду "возможно ли на этапе компиляции приложения использовать только dll'ки, без lib(a)-файлов. Как я понял MinGW (GCC) использует a-файлы (аналог lib-файлов) на этапе компиляции. Но обязательны ли они на этом этапе?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
azure
  опции профиля:
сообщение 22.4.2010, 16:08
Сообщение #10


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 22.4.2010, 15:49) *
я имел в виду "возможно ли на этапе компиляции приложения использовать только dll'ки, без lib(a)-файлов. Как я понял MinGW (GCC) использует a-файлы (аналог lib-файлов) на этапе компиляции. Но обязательны ли они на этом этапе?


Хм! На виндовой машине с помощью gcc собирал либу qwt. Результат - .dll
Далее собирается софтина, которая использует это qwt.dll
В .pro добавлял LIBS += -lqwt5, в путь поиска библиотек добавлялась только .dll

Мне не понятно, зачем вообще может быть нужен .lib (это же статическая либа, так ведь?) для линковки с динамической. И вообще, признаюсь честно, я плохо понимаю, как на самом деле вызываются функции из dll
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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