Импорт .dll в Qt - PullRequest
       28

Импорт .dll в Qt

3 голосов
/ 07 апреля 2010

Я хочу внести зависимость .dll в мой проект Qt.

Поэтому я добавил это в свой файл .pro:

win32 {
LIBS += C:\lib\dependency.lib
LIBS += C:\lib\dependency.dll
}

И затем (я не знаю, еслиэто правильный синтаксис или нет)

#include <windows.h>
Q_DECL_IMPORT int WINAPI DoSomething();

кстати .dll выглядит примерно так:

#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, 
                                        LPVOID lpReserved)
{
    return TRUE;
}

extern "C"
{
int WINAPI DoSomething() { return -1; }
};

Получение ошибки: неразрешенный символ?

Примечание: IУ меня нет опыта работы с .dll вне архитектуры сборки .NET ez pz, определенно n00b.

Ответы [ 3 ]

6 голосов
/ 07 апреля 2010

Ваш синтаксис "LIBS + =" неверен.Попробуйте это:

win32 {
    LIBS += -LC:/lib/ -ldependency
}

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

РЕДАКТИРОВАТЬ:

Я полагаю, что что-то не так в вашей DLL, то есть символы не экспортируются правильно.Я всегда использую шаблон, предоставленный QtCreator:

  1. Внутри проекта dll есть заголовок mydll_global.h с таким кодом:

    #ifdef MYDLL_LIB
        #define MYDLL_EXPORT Q_DECL_EXPORT
    #else
        #define MYDLL_EXPORT Q_DECL_IMPORT
    #endif
    
  2. DllПроект имеет DEFINES + = MYDLL_LIB внутри своего профессионального файла.

  3. Экспортированный класс (или только выбранные методы) и свободные функции помечены MYDLL_EXPORT внутри заголовочных файлов, то есть

    class MYDLL_EXPORT MyClass {
    
    // ...
    
    };
    
2 голосов
/ 07 декабря 2010

Это возможно, если DLL содержит файлы со связью "C" (то есть без декораций класса C ++) и если у вас есть файл заголовка и файл .def для DLL.Если у вас нет файла .def, вы можете легко его создать, загрузив инструмент обхода зависимостей из http://www.dependencywalker.com/, чтобы получить список экспортируемых символов;Вы можете сохранить выходные данные этого инструмента в виде текста, а затем извлечь имена.Затем вы создаете текстовый файл с именем mylibname.def, который содержит:

LIBRARY mylibname

EXPORTS
    FirstExportedFunctionName
    SecondExportedFunctionName
    ...
    LastExpertedFunctionName

Затем вы запускаете dlltool (в MinGW \ bin):

dlltool -d mylibname.def -l mylibname.a

Это сгенерирует mylibname.a, которыйВы добавляете в свой .pro файл:

win32:LIBS += mylibname.a

Вы должны указать пути ко всем файлам или, конечно, скопировать их в нужные папки.

Вы также должны изменить заголовокфайл в вашу стороннюю программу, чтобы все символы в DLL, с которыми вам нужно связаться, были помечены для импорта с помощью Q_DECL_IMPORT.Я делаю это, объявляя все функции в файле .h как:

extern "C" {
MYLIBAPI(retType) FirstFunctionName(arg list...);
MYLIBAPI(retType) SecondFunctionName(arg list...);
...
MYLIBAPI(retType) LastFunctionName(arg list...);
}

, где MYLIBAPI равен

#define MYLIBAPI(retType) Q_DECL_IMPORT retType

Мы используем формат MYLIBAPI (retType), так как это позволяет нам настроитьзаголовочный файл для использования как в импорте, так и при создании DLL, и он также позволяет нам работать с широким спектром различных компиляторов и систем.

Сделав это, мне удалось связать QT в MinGW с DLL, которую я генерируюиспользуя VS 2005. Процедуры в VS были экспортированы как __stdcall.Вам следует обратиться к документации по dlltool для добавления подчеркиваний или других префиксов к именам в библиотеке.

0 голосов
/ 07 апреля 2010

Вам необходимо сделать объявление функции доступным для компоновщика, а также указать путь к библиотеке DLL, в которой она находится. Обычно это делается путем #include заголовочного файла, который содержит объявление.

Вам также не нужен макрос Q_DECL_IMPORT в клиенте - он будет использоваться в заголовке библиотеки Qt, чтобы клиентские приложения могли импортировать функцию. Класс или функция могут быть условно экспортированы / импортированы в зависимости от того, собирается ли библиотека или клиент. Более подробную информацию можно найти на этой странице.

Является ли ваша зависимость сторонним dll или чем-то, что вы создали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...