VS2019+QT5.15调用动态库dll带有命名空间
vs创建动态库
参考:
QT调用vs2019生成的c++动态库-CSDN博客
demo的dll头文件:
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLL3_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLL3_EXPORTS
#define DLL3_API __declspec(dllexport)
#else
#define DLL3_API __declspec(dllimport)
#endif
// 此类是从 dll 导出的
class DLL3_API CDll3 {
public:
CDll3(void);
int name;
int age;
// TODO: 在此处添加方法。
};
extern DLL3_API int nDll3;
extern DLL3_API CDll3;
//extern "C"
namespace MathFunc
{
extern "C" {
DLL3_API int fnDll3(void);
DLL3_API int fnAdd(int a, int b);
DLL3_API int fnSub(int a, int b);
}
}
cpp
// Dll3.cpp : 定义 DLL 的导出函数。
//
#include "pch.h"
#include "framework.h"
#include "Dll3.h"
// 这是导出变量的一个示例
DLL3_API int nDll3=666666;
// 这是导出函数的一个示例。
namespace MathFunc
{
int fnDll3(void)
{
return 666;
}
int fnAdd(int a, int b)
{
return a + b;
}
int fnSub(int a, int b)
{
return a - b;
}
}
/* DLL3_API int fnDll3(void)
{
return 666;
}
DLL3_API int fnAdd(int a, int b)
{
return a + b;
}
DLL3_API int fnSub(int a, int b)
{
return a - b;
}*/
// 这是已导出类的构造函数。
CDll3::CDll3()
{
return;
}
创建c++控制台项目调用测试:
把头文件.h与dll,lib拷贝到项目文件夹里面
VS创建QT项目调用测试:
创建项目后:
把头文件.h与dll,lib拷贝到项目文件夹里面
头文件夹,右键添加现有项,选择Dll3.h
cpp文件调用测试:
#include "QtWidgetsApplication5.h"
#include "Dll3.h"
#pragma comment (lib,"Dll3.lib")
#include <qmessagebox.h>
#pragma execution_character_set("utf-8")
QtWidgetsApplication5::QtWidgetsApplication5(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
int aa=MathFunc::fnAdd(1,2);
QMessageBox::information(this,"title","加法结果:"+QString::number(aa));
int aa2 = MathFunc::fnSub(9, 2);
QMessageBox::information(this, "title", "减法结果:" + QString::number(aa2));
}
QtWidgetsApplication5::~QtWidgetsApplication5()
{}
报错解决方法参考:
vs QT项目E0898 非成员运算符要求类类型或枚举类型的参数C1083: ‘type_traits-CSDN博客