错误 2 error C2491:xx: 不允许 dllimport 静态数据成员 的定义
来源:互联网 发布:网络平台推广 编辑:程序博客网 时间:2024/05/17 16:13
今天在使用 vs 做一个 dll 库,由于要是用 单件模式,在 .h 文件中声明了一个 static 的指针,在对应的cpp文件中定义该变量。导出的时候出现了一个错误:
错误 2error C2491: “SDK_functions::pinstance_”: 不允许 dllimport 静态数据成员 的定义
出现这个错误的原因是我擅自更改了 vs 自动为我建立的导出宏:
// 下列 ifdef 块是创建使从 DLL 导出更简单的// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 CYAPI_2013_EXPORTS// 符号编译的。在使用此 DLL 的// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将// CYAPI_2013_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的// 符号视为是被导出的。#ifdef CYAPI_EXPORTS#define CYAPI_API __declspec(dllexport)#else#define CYAPI_API __declspec(dllimport)#endif可以看到,我手动把对应的2013这几个字符去掉了,这就导致了 CYAPI_EXPORTS 这个宏没有定义,从而使用了 __declspec(dllimport)。__declspec(dllexport) 是用来导出的,为我这样写导出库的人所用; __declspec(dllimport) 是导入,为使用这个库的人所用。
在msdn 中说:不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。
而别人想使用我这个库的静态变量,就必须使用__declspec(dllimport) 才能导入 DLL 中使用的变量,所以与之对应就必须使用__declspec(dllexport)来导出这个变量。而对于一般变量而言就不需要了。
阅读全文
0 0
- 错误 2 error C2491:xx: 不允许 dllimport 静态数据成员 的定义
- error C2491 definition of dllimport static data member not allowed(不允许dllimport静态数据成员的定义)
- error C2491: 不允许 dllimport 函数 的定义
- error C2491: “Add” : 不允许 dllimport 函数 的定义
- VS2015---不允许 dllimport 静态数据成员的定义
- 错误:在xx导出类中,不允许dllimport静态数据成员
- 在xx导出类中,不允许dllimport静态数据成员
- 不允许 dllimport 静态数据成员
- 不允许 dllimport 静态数据成员
- 不允许 dllimport 静态数据成员
- 不允许 dllimport 静态数据成员
- 不允许 dllimport 静态数据成员
- 不允许 dllimport 静态数据成员
- VS2005编译DLL错误,error C2491: 'CMyClass::Function' : definition of dllimport function not allowed
- xx.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) 错误
- C++ 定义静态数据成员
- 类静态数据成员定义
- C++实例 静态成员的引入——静态数据成员的定义、调用,静态成员函数的实现、调用。
- Java中几种列表的简单介绍
- Spark-大数据处理框架的安装
- 搜索训练1 [8数码问题]
- webpack学习笔记-2-file-loader 和 url-loader
- tomcat内存设置
- 错误 2 error C2491:xx: 不允许 dllimport 静态数据成员 的定义
- nvarchar和varchar的不同
- linux命令学习--sort排序命令
- Spring Security(14)——权限鉴定基础
- DCMTK学习之JPG格式与BMP格式
- 技术分析 | 新型勒索病毒Petya如何对你的文件进行加密
- 引用三方framewrok的问题
- JAVAWEB开发之——Linux命令实战、虚拟机和centos的安装以及联网、常用命令、vi编辑以及软件的安装、sftp的使用
- matlab生成exe