发布于2020-03-19 11:05 阅读(734) 评论(0) 点赞(21) 收藏(5)
1. QT调用vs静态库
vs编译出的静态库文件:xxx.lib xxx.h
QT调用静态库会在编译阶段就加载具体函数实体,但因为QT默认使用MinGW编译器,而vs默认使用MSVC。两者编译方式不同,因此加载会不成功。
解决办法:将QT编译器设置为vs相同的版本
2. QT调用vs动态库
vs编译出动态库文件:xxx.dll xxx.lib xxx.h
2.1. 显式调用
显式调用只需要xxx.dll文件,但需要设置导出参数:
{
设置1. __ declspec(dllexport): 如果将一个函数作为导出函数被其它程序调用,需要在声明函数前加此标识符。同时vs也提供一种无需此标识符的方法,即使用xxx.def。只需将导出函数名写入xxx.def文件,并在工程属性中配置链接器-输入-模块定义文件,就可以在声明函数前去掉__ declspec(dllexport)标识了。两者的区别可另行研究。
设置2. extern“C”:由于C++语法中函数存在重载,因为在编译C++时会将函数名进行修改,而加此标识符是告诉编译器按照C的语法进行编译次函数,即不修改函数名。
设置3. __cdecl:默认C/C++调用方式是__cdecl,但是这种调用方式需要调用方对函数进行清栈处理, 尤其是调用方非C++程序时,会因为无法清栈而报错,可以设置调用方式为__stdcall,让API函数自己清栈。
最终导出函数声明示例:extern "C" __declspec(dllexport) int __cdecl MyFuncAPI(int data);
最终导出函数实现示例:int __cdecl MyFuncAPI(int data) { };
}
QLibrary lib("xxx.dll");
if( ! lib.load()) error;
typedef int (*MyFun)(int data);
MyFun pMyFun = (MyFun)lib.resolve("MyFuncAPI");
if(pMyFun) {
int ret = pMyFun(a); };
2.2. 隐式调用
隐式调用需要xxx.lib xxx.h xxx.dll
配置如同显式调用一样配置,在此不做累述。
2.2.1. 打开QT工程中xxx.pro文件,在文件中右键(或在工程名右键)选择“添加库...”---外部库---选择xxx.lib文件,然后取消掉Linux和Mac平台,链接选择动态库等等。会默认在xxx.pro中添加编译所需配置。
2.2.2. 在所需所包含头文件include "xxx.h"。在xxx.h中每一个导出的函数在函数名前加此标识符“__declspec(dllimport)”声明为导出函数,。
最终示例为:extern "C" __declspec(dllimport) int __cdecl MyFuncAPI(int data);
2.2.3. 将xxx.dll拷贝至QT工程生成xxx.exe相同目录下。
此致在QT工程中调用动态库,如同调用普通函数。
原文链接:https://blog.csdn.net/sinat_33383231/article/details/104905643
作者:战天
链接:https://www.pythonheidong.com/blog/article/268413/0342f61efe2a3a6ad90e/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!