这段时间要把tinyxml从静态库弄成动态库,要用到__declspec(dllexport)和__declspec(dllimport)来导出dll和lib文件。终于弄明白了export和import的作用,下面从使用的角度来说明一下他们的功能。

  首先要知道,头文件是C++的接口文件,不仅本工程需要使用头文件来进行编译,给其他工程提供dll的时候也要提供此dll的头文件才能让其他人通过编程的方式来使用dll。记住:头文件要给自己用还要给别人用。

  比如一个项目中的Class中含有一个静态变量,生成dll的时候只采用了__declspec(dllexport) 如下:

dll工程

A1.h:

[cpp] view plaincopy
  1. #define OS_API_EXPORT __declspec(dllexport)
  2. 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

[cpp] view plaincopy
  1. #define OS_API_IMPORT __declspec(dllimport)
  2. #define OS_API_EXPORT __declspec(dllexport)
  3. #ifdef BUILD_DLL
  4. #define OS_API OS_API_EXPORT //如果是生成dll工程,那么导出
  5. #else
  6. #define OS_API OS_API_IMPORT //如果是生成使用dll的工程,那么导入
  7. #endif
  8. class OS_API A{static int a;}

同时别忘了在dll工程属性下设置预处理器定义BUILD_DLL

从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用相关推荐

  1. 【转】extern “C“和__declspec(dllexport)以及__declspec(dllimport) 和def的简单解析

    转自:https://blog.csdn.net/xupan_jsj/article/details/9028759 前面的extern "C"  __declspec(dllex ...

  2. extern C和__declspec(dllexport)以及__declspec(dllimport) 和def的简单解析

    前面的extern "C"  __declspec(dllexport)  __declspec(dllimport)都是用于函数或者变量,甚至类的声明的(可以把extern &q ...

  3. __declspec(dllexport)、__declspec(dllimport)详解

    在Visual studio中新建DLL项目时编译器会自动生成下面这样的宏定义: #ifdef DLL_EXPORTS #define DLL_API __declspec(dllexport) #e ...

  4. C++dll导出类的方式__declspec(dllexport)

    前言 有时导出dll的时候既想用到整个类又想保持多态 一.直接导出整个类 示例: 头文件 #ifdef AITWapper_EXP //根据项目是导入导出预定义 #define AITWapper_D ...

  5. Windows DLL编程中的导入导出:__declspec(dllimport) ,__declspec(dllexport) ,

    在Windows DLL编程时,可使用__declspec(dllimport)关键字导入函数或者变量. 函数的导入 当你需要使用DLL中的函数时,往往不需要显示地导入函数,编译器可自动完成.但如果你 ...

  6. 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法

    转自:https://blog.csdn.net/qing666888/article/details/41135245 一,__ declspec(dllexport): 将一个函数声名为导出函数, ...

  7. 关于__declspect(dllexport) 和 __declspec(dllimport)的使用

    __declspec(dllexport) 声明一个导出函数,是说这个函数要从本dll中导出,提供给别人用. 省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是C++类的话, ...

  8. 【转载】__declspec(dllimport) __declspec(dllexport)

    https://blog.csdn.net/fsdad/article/details/115632555 一.基本概念 _declspec(dllexport)与_declspec(dllimpor ...

  9. extern C __declspec(dllexport) __declspec(dllimport) 和 def

    前面的extern "C"  __declspec(dllexport)  __declspec(dllimport)都是用于函数或者变量,甚至类的声明的(可以把extern &q ...

最新文章

  1. mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法
  2. oracle分页查询数据(收藏)
  3. ADS2017打开出现cannot create the directory,解决办法。
  4. 30.Node.js 全局对象
  5. 类属性-类属性的定义及使用
  6. ARC107——D - Number of Multisets
  7. 前端为什么说github很重要_私域流量|为什么说私域流量很重要?
  8. IntelliJ IDEA开发入门教程
  9. python基础教程运行程序_Python入门基础教程:WSGI
  10. PostgreSQL 连接的问题
  11. js读取cookie,js添加cookie,js删除cookie
  12. 【转】关于python中re模块split方法的使用
  13. python-面试通关宝典
  14. 计算机软件英文参考文献,软件工程英文参考文献(优秀范文105个)
  15. 数字图像处理 冈萨雷斯 课后习题答案
  16. 简单的个人发展规划java,java个人职业发展方向规划范文
  17. 阿里规范说MySQL单表行数不要超过2000w,为啥?
  18. 02142数据结构导论
  19. wireshark win7无响应
  20. 以亲身经历解读经典的定律或法则

热门文章

  1. 排序系列【比较排序系列之】直接插入排序
  2. 不同的写法 其中 1 2 (试了下 没有效果 ,先记载这里把)
  3. 领域驱动设计和实践(转:http://kb.cnblogs.com/page/112298/)
  4. Eclipse RCP使用SWT.EMBEDDED方式显示batik的svgCanvas后窗口最大化变白问题
  5. liunx常用命令笔记
  6. nodejs-- vuex中mapActions
  7. 白山云科技 CTO 童剑:空降后,如何有技术又有艺术地破局?
  8. URL转微信可识别的二维码
  9. 根据 设备名(br0/eth0/em0)称获取 当前机器的IP地址与子网掩码信息
  10. 如何实现线程间的通讯(转载)