从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用
这段时间要把tinyxml从静态库弄成动态库,要用到__declspec(dllexport)和__declspec(dllimport)来导出dll和lib文件。终于弄明白了export和import的作用,下面从使用的角度来说明一下他们的功能。
首先要知道,头文件是C++的接口文件,不仅本工程需要使用头文件来进行编译,给其他工程提供dll的时候也要提供此dll的头文件才能让其他人通过编程的方式来使用dll。记住:头文件要给自己用还要给别人用。
比如一个项目中的Class中含有一个静态变量,生成dll的时候只采用了__declspec(dllexport) 如下:
dll工程
A1.h:
- #define OS_API_EXPORT __declspec(dllexport)
- class OS_API_EXPORT A {static int a;}
A.cpp:
#include “A.h”static A::a=0; //静态变量的初始化要写在cpp文件中
这样做的时候编译dll工程的时候没有问题,但是如果把dll和头文件提供给别人使用的时候就会出“unsloved symbol a”的问题。
原因是静态成员如果不import,是不能够被编译器从lib文件里找到的。
使用dll的工程在编译时也会将dll相关的头文件列入编译对象,而不会理会dll的cpp文件中的初始化过程,因此会出现a没有定义的情况,这时
__declspec(dllimport)就派上用场了,他会告诉使用dll的工程去lib中找到这个静态变量的定义。提供给别人使用的dll头文件应当写成:
A2.h:
#define OS_API_IMPORT __declspec(dllimport)class OS_API_IMPORT A {static int a;}
当使用A.dll的工程链接上A2.h后,就不会出现“unsloved symbol a”的问题了。
最终为了方便程序的开发,不用分别写出dll工程的头文件和使用dll工程的头文件,头文件可以写为如下形式:
A.h
- #define OS_API_IMPORT __declspec(dllimport)
- #define OS_API_EXPORT __declspec(dllexport)
- #ifdef BUILD_DLL
- #define OS_API OS_API_EXPORT //如果是生成dll工程,那么导出
- #else
- #define OS_API OS_API_IMPORT //如果是生成使用dll的工程,那么导入
- #endif
- class OS_API A{static int a;}
同时别忘了在dll工程属性下设置预处理器定义BUILD_DLL
从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用相关推荐
- 【转】extern “C“和__declspec(dllexport)以及__declspec(dllimport) 和def的简单解析
转自:https://blog.csdn.net/xupan_jsj/article/details/9028759 前面的extern "C" __declspec(dllex ...
- extern C和__declspec(dllexport)以及__declspec(dllimport) 和def的简单解析
前面的extern "C" __declspec(dllexport) __declspec(dllimport)都是用于函数或者变量,甚至类的声明的(可以把extern &q ...
- __declspec(dllexport)、__declspec(dllimport)详解
在Visual studio中新建DLL项目时编译器会自动生成下面这样的宏定义: #ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) #e ...
- C++dll导出类的方式__declspec(dllexport)
前言 有时导出dll的时候既想用到整个类又想保持多态 一.直接导出整个类 示例: 头文件 #ifdef AITWapper_EXP //根据项目是导入导出预定义 #define AITWapper_D ...
- Windows DLL编程中的导入导出:__declspec(dllimport) ,__declspec(dllexport) ,
在Windows DLL编程时,可使用__declspec(dllimport)关键字导入函数或者变量. 函数的导入 当你需要使用DLL中的函数时,往往不需要显示地导入函数,编译器可自动完成.但如果你 ...
- 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法
转自:https://blog.csdn.net/qing666888/article/details/41135245 一,__ declspec(dllexport): 将一个函数声名为导出函数, ...
- 关于__declspect(dllexport) 和 __declspec(dllimport)的使用
__declspec(dllexport) 声明一个导出函数,是说这个函数要从本dll中导出,提供给别人用. 省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++类的话, ...
- 【转载】__declspec(dllimport) __declspec(dllexport)
https://blog.csdn.net/fsdad/article/details/115632555 一.基本概念 _declspec(dllexport)与_declspec(dllimpor ...
- extern C __declspec(dllexport) __declspec(dllimport) 和 def
前面的extern "C" __declspec(dllexport) __declspec(dllimport)都是用于函数或者变量,甚至类的声明的(可以把extern &q ...
最新文章
- mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法
- oracle分页查询数据(收藏)
- ADS2017打开出现cannot create the directory,解决办法。
- 30.Node.js 全局对象
- 类属性-类属性的定义及使用
- ARC107——D - Number of Multisets
- 前端为什么说github很重要_私域流量|为什么说私域流量很重要?
- IntelliJ IDEA开发入门教程
- python基础教程运行程序_Python入门基础教程:WSGI
- PostgreSQL 连接的问题
- js读取cookie,js添加cookie,js删除cookie
- 【转】关于python中re模块split方法的使用
- python-面试通关宝典
- 计算机软件英文参考文献,软件工程英文参考文献(优秀范文105个)
- 数字图像处理 冈萨雷斯 课后习题答案
- 简单的个人发展规划java,java个人职业发展方向规划范文
- 阿里规范说MySQL单表行数不要超过2000w,为啥?
- 02142数据结构导论
- wireshark win7无响应
- 以亲身经历解读经典的定律或法则
热门文章
- 排序系列【比较排序系列之】直接插入排序
- 不同的写法 其中 1 2 (试了下 没有效果 ,先记载这里把)
- 领域驱动设计和实践(转:http://kb.cnblogs.com/page/112298/)
- Eclipse RCP使用SWT.EMBEDDED方式显示batik的svgCanvas后窗口最大化变白问题
- liunx常用命令笔记
- nodejs-- vuex中mapActions
- 白山云科技 CTO 童剑:空降后,如何有技术又有艺术地破局?
- URL转微信可识别的二维码
- 根据 设备名(br0/eth0/em0)称获取 当前机器的IP地址与子网掩码信息
- 如何实现线程间的通讯(转载)