程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(2)

QT如何使用vs导出的库函数

发布于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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)