找回密码
 立即注册
收起左侧

qt调用dll库

11
回复
9928
查看
[复制链接]
累计签到:6 天
连续签到:2 天
来源: 2018-10-23 23:07:08 显示全部楼层 |阅读模式
2Qter豆
显式调用或者隐式调用C++接口的dll库,有没有简单的案例,或者应该着重注意哪些地方,小白求大神指教!
显式调用时程序不报错,但是不能正确加载出dll,或者不能解析处dll中函数。
隐式调用时报错:LNK1104:无法打开Enhancement。lib文件,我有在pro文件中加:LIBS +=D:/study/QT_Test/Test/test/PicEn/libEnhancement.a

最佳答案

查看完整内容

看了你上面的描述,是采用QLibrary来加载库的,这种方式优点在于,即使对应库文件不存在时,可以根据自己的代码,程序仍然可以运行; 常规的做法是,直接在工程里添加,这样当库文件不存在时,程序会提示“丢失xxx库文件”,程序无法启动。 如果你确定使用QLibrary的吧,按帖子先学习吧。 Qt 之在运行时加载共享库 ...
回复

使用道具 举报

累计签到:597 天
连续签到:1 天
2018-10-23 23:07:09 显示全部楼层
看了你上面的描述,是采用QLibrary来加载库的,这种方式优点在于,即使对应库文件不存在时,可以根据自己的代码,程序仍然可以运行;
常规的做法是,直接在工程里添加,这样当库文件不存在时,程序会提示“丢失xxx库文件”,程序无法启动。

如果你确定使用QLibrary的吧,按帖子先学习吧。
Qt 之在运行时加载共享库
回复

使用道具 举报

累计签到:597 天
连续签到:1 天
2018-10-24 08:56:08 显示全部楼层
1、首先确定好系统平台;
2、库与可执行文件,最好同一编译器生成;
3、库工程提供(win).lib .dll .h (linux for PC/linux for ARM大同小异);
4、如果想可执行文件调试库工程,还需要.pdb文件;
5、可执行文件工程,要指定 .lib路径,包含.h头文件、.dll 要与exe放在一起

主要还是自己写Demo试试各种情况,就恍然大悟了
回复

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-10-24 09:20:04 显示全部楼层
回复

使用道具 举报

累计签到:6 天
连续签到:2 天
2018-10-25 14:51:40 显示全部楼层
shasidaran 发表于 2018-10-24 08:56
1、首先确定好系统平台;
2、库与可执行文件,最好同一编译器生成;
3、库工程提供(win).lib .dll .h (linu ...

我发现dll是64位,但我的QT构建套件是MinGW32bit,还有个问题是我调用的是别人的dll,他的函数中有_declspec(dllexport),我在调用的时候是不是还要dllimport下

点评

对 编译环境要一致,32位exe访问64位dll,寻址方式不一样,一般会提示“不能定位到链接点”; 由于引用dll时,只包含了声明的.h,实际对应的实现方法封装在dll中,因此需要添加关键字dllimport,表示从外部导入  详情 回复 发表于 2018-10-26 08:42
回复

使用道具 举报

累计签到:597 天
连续签到:1 天
2018-10-26 08:42:23 显示全部楼层
都忘了 发表于 2018-10-25 14:51
我发现dll是64位,但我的QT构建套件是MinGW32bit,还有个问题是我调用的是别人的dll,他的函数中有_declsp ...

对 编译环境要一致,32位exe访问64位dll,寻址方式不一样,一般会提示“不能定位到链接点”;
由于引用dll时,只包含了声明的.h,实际对应的实现方法封装在dll中,因此需要添加关键字dllimport,表示从外部导入
回复

使用道具 举报

累计签到:6 天
连续签到:2 天
2018-10-26 11:17:48 显示全部楼层
shasidaran 发表于 2018-10-26 08:42
对 编译环境要一致,32位exe访问64位dll,寻址方式不一样,一般会提示“不能定位到链接点”;
由于引用dl ...

我现在将构建套件修改成了MSVC2017 64位,只是在测试加载dll是否成功,还没有涉及到调用函数的问题:QLibrary lib("Enhancement.dll"); if(lib.load()) 如果加载成功就弹出成功的对话框,还是不能成功,不知道什么原因。程序不报错,也#include "Enhancement.h",.h和.lib放在程序目录。.dll放在了生成的.exe同级目录中
回复

使用道具 举报

累计签到:6 天
连续签到:2 天
2018-10-26 13:45:34 来自手机 显示全部楼层
都忘了 发表于 2018-10-26 11:17
我现在将构建套件修改成了MSVC2017 64位,只是在测试加载dll是否成功,还没有涉及到调用函数的问题:QLib ...

可以调用自己写的qt动态库
回复

使用道具 举报

累计签到:6 天
连续签到:2 天
2018-10-29 13:36:02 显示全部楼层
shasidaran 发表于 2018-10-26 08:42
对 编译环境要一致,32位exe访问64位dll,寻址方式不一样,一般会提示“不能定位到链接点”;
由于引用dl ...

大神,在调用C++库时,我添加了
extern "C++"
{
#include "Enhancement.h"
bool _declspec (dllimport) Enhance(unsigned char *pInput, unsigned char *pOutput, int nWidth, int nHeight, float fMin , float fMax );
}这部分代码,可以load dll库,但是不能resolve解析,您知道什么原因吗

点评

what? extern "c++" 还有这种操作吗?  发表于 2018-10-29 14:51
回复

使用道具 举报

累计签到:597 天
连续签到:1 天
2018-10-29 15:03:36 显示全部楼层
至于extern  "C" 这是个关键字,是给链接器看的,声明存在C++中调用C的方法,
用于代码混用C++和C两种风格语言的,
至于extern "C++" 我没见过,可能我见识比较少。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了