/extern "C" Q_DECL_EXPORT
时间: 2023-11-06 10:06:24 浏览: 180
/extern "C" Q_DECL_EXPORT 是一个用于在C++代码中导出函数的语法。在C++中,函数默认会进行名称修饰,也就是会加上一些额外的信息以区分不同的函数。而使用/extern "C"关键字可以告诉编译器不对函数名称进行修饰,使得该函数可以在C语言中被调用。而Q_DECL_EXPORT宏是Qt框架中的一个宏定义,用于标识将该函数导出为动态链接库(DLL)中的函数,同时生成.lib文件以供外部接口使用。因此,/extern "C" Q_DECL_EXPORT的作用是将这个函数导出为动态链接库中的一个可以在C语言环境中调用的函数。
相关问题
QT创建一个易语言调用的dll必须用c吗
不一定需要使用C来创建一个易语言调用的DLL,也可以使用C++和QT来创建。在QT中,可以使用Q_PLUGIN_METADATA宏来实现将C++类导出为DLL并注册到Qt的插件系统中,从而允许易语言调用。以下是一个简单的例子:
1.创建一个新的QT Widgets应用程序项目。
2.创建一个新的类,例如MyClass,将其继承自QObject类,并添加必要的函数和信号。
```c++
// myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
~MyClass();
void myFunction();
signals:
void mySignal();
};
#endif // MYCLASS_H
```
```c++
// myclass.cpp
#include "myclass.h"
MyClass::MyClass(QObject *parent) : QObject(parent)
{
}
MyClass::~MyClass()
{
}
void MyClass::myFunction()
{
emit mySignal();
}
```
3.在myclass.h文件中添加以下内容,将其导出为DLL。
```c++
#if defined(MYCLASS_LIBRARY)
# define MYCLASSSHARED_EXPORT Q_DECL_EXPORT
#else
# define MYCLASSSHARED_EXPORT Q_DECL_IMPORT
#endif
class MYCLASSSHARED_EXPORT MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
~MyClass();
void myFunction();
signals:
void mySignal();
};
```
4.在.pro文件中添加以下内容,将其设置为插件。
```c++
QT += core
QT -= gui
CONFIG += c++11 console
DEFINES += MYCLASS_LIBRARY
TARGET = MyClass
TEMPLATE = lib
SOURCES += myclass.cpp
HEADERS += myclass.h
CONFIG += plugin
Q_PLUGIN_METADATA(IID "com.myorg.MyClass" FILE "myclass.json")
```
5.创建一个myclass.json文件,其中包含有关插件的元数据信息。
```json
{
"Keys": ["MyClass"],
"MetaData": {
"IID": "com.myorg.MyClass",
"MetaData": {
"version": 1.0,
"className": "MyClass",
"debug": false,
"vendor": "MyOrg"
}
},
"Platforms": [
"windows"
],
"Architectures": [
"x86",
"x64"
]
}
```
6.编译项目并生成DLL文件。
7.在易语言中使用LoadLibrary和GetProcAddress函数加载并调用DLL中的函数。
需要注意的是,易语言只能调用C风格的函数,因此需要使用extern "C"来声明C语言风格的函数。例如:
```c++
// myclass.h
extern "C" {
MYCLASSSHARED_EXPORT MyClass* createInstance();
MYCLASSSHARED_EXPORT void deleteInstance(MyClass *obj);
}
```
```c++
// myclass.cpp
extern "C" {
MYCLASSSHARED_EXPORT MyClass* createInstance()
{
return new MyClass();
}
MYCLASSSHARED_EXPORT void deleteInstance(MyClass *obj)
{
delete obj;
}
}
```
这将允许易语言调用createInstance和deleteInstance函数来创建和销毁MyClass类的实例。
阅读全文