我想将.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。
答案 0 :(得分:6)
您的“LIBS + =”语法错误。试试这个:
win32 {
LIBS += -LC:/lib/ -ldependency
}
我也不确定你的.pro文件中是否有带驱动器号的绝对路径是个好主意 - 我通常会将依赖项保存在项目树的某处并使用相对路径。
编辑:
我认为你的dll出了问题,即符号输出不正确。我总是使用QtCreator提供的模板:
在dll项目中,有mydll_global.h标头,代码如下:
#ifdef MYDLL_LIB
#define MYDLL_EXPORT Q_DECL_EXPORT
#else
#define MYDLL_EXPORT Q_DECL_IMPORT
#endif
Dll项目在其专业档案中有DEFINES + = MYDLL_LIB。
导出的类(或仅选择的方法)和自由函数在头文件中标有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还是你创造的东西?