Использование сторонних библиотек, Как использовать функции из .dll? |
Здравствуйте, гость ( Вход | Регистрация )
Использование сторонних библиотек, Как использовать функции из .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 |
Можно ли использовать эти .dll без использования вышеуказанных компиляторов? Конкретно интересует gcc/mingw? Если можно, то как? если dll создана по "всем правилам", то можно с помощью MinGW использовать dll'ку созданную MS Visual C++.Делается всё по аналогии со сборкой драйвера FireBird (QIBase). сделай pri-файл, для внешней библиотеки, положи его в её корень. Предположим, что заголовочник лежит в каталоге include lib-файл в каталоге lib и библиотека называется name.lib (name.dll, соответсвенно) тогда pri-файл должен выглядеть так
подключи этот 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 |
|
|
|
Влад |
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 |
|
|
|
Iron Bug |
22.4.2010, 14:39
Сообщение
#8
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
|
|
|
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 |
я имел в виду "возможно ли на этапе компиляции приложения использовать только dll'ки, без lib(a)-файлов. Как я понял MinGW (GCC) использует a-файлы (аналог lib-файлов) на этапе компиляции. Но обязательны ли они на этом этапе? Хм! На виндовой машине с помощью gcc собирал либу qwt. Результат - .dll Далее собирается софтина, которая использует это qwt.dll В .pro добавлял LIBS += -lqwt5, в путь поиска библиотек добавлялась только .dll Мне не понятно, зачем вообще может быть нужен .lib (это же статическая либа, так ведь?) для линковки с динамической. И вообще, признаюсь честно, я плохо понимаю, как на самом деле вызываются функции из dll |
|
|
Текстовая версия | Сейчас: 22.11.2024, 18:30 |