zoukankan      html  css  js  c++  java
  • Qt+VS2019 创建并调用dll文件

    1 背景

    (1)将现有的能正常运行的qt项目转化为dll,并在其他程序调用和显示;
    (2)已经在vs2019中装了qt5.12.5的插件

    2 思路

    分两步,先生成dll,然后再调用

    3步骤

    3.1 生成dll

    (1)在vs中打开qt项目
    image
    如图,依次点击【扩展】——》【Qt VS Tools】——》【Open Qt Project File】,然后选择要打开的Qt项目;
    (2)配置属性
    image
    a、打开项目的属性文件,在【配置属性】——》【常规】——》【配置类型】中选择【动态库(.dll)】;
    image
    b、在属性文件的【连接器】——》【输出文件】中,改为以.dll结尾的名称;
    (3)添加头文件
    a、添加定义宏的头文件
    image
    如图,在项目的heard files文件夹上,点击鼠标右键,添加【新建项】,在新建项内选择.h文件,并命名为XXX_global.h,在内容中添加如下代码:

    点击查看代码
    #pragma once
    
    #include <QtCore/qglobal.h>
    
    #ifndef BUILD_STATIC
    # if defined(SAMP8_2_LIB)
    #  define SAMP8_2_EXPORT Q_DECL_EXPORT
    # else
    #  define SAMP8_2_EXPORT Q_DECL_IMPORT
    # endif
    #else
    # define SAMP8_2_EXPORT
    #endif
    
    【注】这里需要添加预处理器定义

    image
    如上图所示,在【属性】——》【C/C++】——》【预处理器】——》【预处理器定义】,在里面添加头文件中链接库,即添加(SAMP8_2_LIB),头文件中第4行代码定义的啥,这里就输入啥;
    (b)添加函数接口头文件
    添加步骤同添加XXX_global.h的方式一样,只是名字定义为XXX.h。在此文件中添加需要导出函数的声明;

    点击查看代码
    #pragma once
    
    #include "samp8_2_global.h"
    
    class SAMP8_2_EXPORT Samp8_2
    {
    public:
        Samp8_2();
    };
    extern "C" SAMP8_2_EXPORT int getVersion();
    extern "C" SAMP8_2_EXPORT int realmain(int argc, char* argv[]);
    
    (4)实现头文件中声明的函数 【注】这里直接在当前项目的mian函数中,添加头文件,并修改mian函数的名字为realmain,代码如下:
    点击查看代码
    #include "widget.h"
    #include <QApplication>
    
    #include"samp8_2.h"
    
    int realmain(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    

    这就可以生成dll文件了,一般可在当前项目的的debug文件夹下查看。

    3.2调用dll

    (1)创建一个qt应用程序
    image
    如上图所示。添加一个Qt widgets Application。
    (2)配置程序属性
    【a】配置附加包含目录
    image
    如上图所示,在应用的【属性】——》【C/C++】——》【附加包含目录】中,添加生成dll项目头文件所在的目录;
    【b】配置链接器附加库目录
    image
    如上图,在【属性】——》【链接器】——》【附加库目录】中,将库的.lib所在的路径添加进来;
    【c】配置链接器中的附加依赖项
    image
    如上图,输入库的.lib名字;
    【d】复制dll文件到应用程序的运行目录下;
    可以手动复制dll到应用程序的运行文件夹下,也可以通过设置命令行进行自动复制;自动复制的设置如下:
    image
    在【属性】——》【生成事件】——》【生成后事件】——【命令行】。输入
    xcopy /y /d "..\..\MathLibrary\$(IntDir)samp8_2.dll(自己的dll的路径,绝对/相对都可以)" "$(OutDir)"

    3.3调用库文件中的函数

    int c = realmain(argc, argv);

    参考文献

    【1】https://blog.csdn.net/snail2651/article/details/80902328
    【2】https://docs.microsoft.com/zh-cn/cpp/build/dlls-in-visual-cpp?view=msvc-170

  • 相关阅读:
    java.util.concurrent.atomic 包详解
    SpringBoot RESTful 应用中的异常处理小结
    Spring 核心框架体系结构
    Java 的静态代理 动态代理(JDK和cglib)
    Spring5:@Autowired注解、@Resource注解和@Service注解
    offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别
    一个小技能
    在chrome console添加jQuery支持
    如和判断两个浮点数是否相等
    Object.create() vs new SomeFunction() in javascript
  • 原文地址:https://www.cnblogs.com/neverguveip/p/15634941.html
Copyright © 2011-2022 走看看