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

posted @ 2021-12-03 17:18  吴春旭  阅读(2222)  评论(0编辑  收藏  举报