引用dll报错:error C2491-不允许 dllimport 静态数据成员 的定义

本文主要是介绍引用dll报错:error C2491-不允许 dllimport 静态数据成员 的定义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

创建一个QT的dll工程,生成lib、dll文件后,新建一个测试工程,将动态库的头文件、lib文件加入到该工程里,通过头文件引用dll的导出类.

编译测试工程时报错:

1>GeneratedFiles\Release\moc_TestDll.cpp(58): warning C4273: “TestDll::qt_static_metacall”: dll 链接不一致
1>  d:\code\test\vs\qtguiapplication1\qtguiapplication1\generatedfiles\release\../../TestDll.h(26): note: 参见“qt_static_metacall”的前一个定义 (编译源文件 GeneratedFiles\Release\moc_TestDll.cpp)
1>GeneratedFiles\Release\moc_TestDll.cpp(65): warning C4273: “staticMetaObject”: dll 链接不一致

1>  d:\code\test\vs\qtguiapplication1\qtguiapplication1\generatedfiles\release\../../TestDll.h(26): note: 参见“public: static QMetaObject const TestDll::staticMetaObject”的前一个定义 (编译源文件 GeneratedFiles\Release\moc_TestDll.cpp)
1>GeneratedFiles\Release\moc_TestDll.cpp(65): **<u>error C2491</u>**: “TestDll::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义


导出类头文件的代码如下:

#pragma once#include <QtCore/qglobal.h>#ifndef BUILD_STATIC
# if defined(TESTDLL_LIB)
#  define TESTDLL_EXPORT Q_DECL_EXPORT
# else
#  define TESTDLL_EXPORT Q_DECL_IMPORT
# endif
#else
# define TESTDLL_EXPORT
#endifclass TESTDLL_EXPORT TestDll :public QObject
{Q_OBJECT
public:TestDll();~TestDll();...int f(int param);};

查看出错的代码行是:Q_OBJECT

而Q_OBJECT是一个宏定义:

#define Q_OBJECT \
public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static const QMetaObject staticMetaObject; \virtual const QMetaObject *metaObject() const; \virtual void *qt_metacast(const char *); \virtual int qt_metacall(QMetaObject::Call, int, void **); \QT_TR_FUNCTIONS \
private: \Q_OBJECT_NO_ATTRIBUTES_WARNING \Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \QT_WARNING_POP \struct QPrivateSignal {}; \QT_ANNOTATE_CLASS(qt_qobject, "")

其中QT_TR_FUNCTIONS又是一个宏定义:

# define QT_TR_FUNCTIONS \
static inline QString tr(const char *s, const char *c = Q_NULLPTR, int n = -1) \{ return staticMetaObject.tr(s, c, n); } \
QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = Q_NULLPTR, int n = -1) \{ return staticMetaObject.tr(s, c, n); }

由此可见,之所以编译会报错是因为导出类的类体里的Q_OBJECT定义了静态的内联函数,而这是被VS禁止的:

'identifier' : definition of dllimport function not allowed
Data, static data members, and functions can be declared as dllimports but not defined as dllimports.

错误描述:不允许定义dllimport修饰的函数

数据,静态数据成员和函数在声明时可以使用dllimport修饰,但定义时禁止使用dllimport修饰。

 

解决方法

去掉类TestDll之前的TESTDLL_EXPORT,编译就通过了。

附微软官方文档说明:

https://docs.microsoft.com/zh-cn/cpp/error-messages/compiler-errors-1/compiler-error-c2491?view=vs-2019

Compiler Error C2491
2016/11/04

'identifier' : definition of dllimport function not allowed
Data, static data members, and functions can be declared as dllimports but not defined as dllimports.
To fix this issue, remove the __declspec(dllimport) specifier from the definition of the function.
The following sample generates C2491:

// C2491.cpp
// compile with: /c
// function definition
void __declspec(dllimport) funcB() {}   // C2491

// function declaration
void __declspec(dllimport) funcB();   // OK

这篇关于引用dll报错:error C2491-不允许 dllimport 静态数据成员 的定义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491567

相关文章

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以