将.dll导入Qt

时间:2010-04-07 05:56:15

标签: c++ qt dll

我想将.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; }
};

获取错误:未解决的符号?

注意:我没有.dll在.NET的ez pz程序集架构之外没有经验,绝对是n00b。

3 个答案:

答案 0 :(得分:6)

您的“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 {
    
    // ...
    
    };
    

答案 1 :(得分:2)

如果DLL包含具有“C”链接的文件(即没有C ++类装饰),并且如果您有DLL的头文件和.def文件,则可以执行此操作。如果您没有.def文件,可以通过从http://www.dependencywalker.com/下载依赖性walker工具轻松创建一个文件,以获取导出符号列表;您可以将此工具的输出保存为文本,然后提取名称。然后创建一个名为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时使用,它还允许我们使用各种不同的编译器和系统。

这样做,我设法将MinGW中的QT链接到我使用VS 2005生成的DLL.VS中的例程被导出为__stdcall。您应该查看dlltool文档,以便为库中的名称添加下划线或其他前缀。

答案 2 :(得分:0)

您需要为链接器提供函数声明,并提供它所在的dll的路径。通常这是通过#include包含声明的头文件来完成的。

您也不需要客户端中的Q_DECL_IMPORT宏 - 这将在Qt库的标头中使用,以允许客户端应用程序导入该功能。根据是否正在构建库或客户端,将有条件地导出/导入类或函数。更多信息可以在this页面找到。

你的依赖是第三方dll还是你创造的东西?