从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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java网络爬虫基础知识

Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 Apa...

652
来自专栏菩提树下的杨过

silverlight中的socket编程注意事项

1.粘包 目前sl中的socket只能用tcp/ip协议,而tcp/ip本质是一个"流"协议,也就是说数据无边界,发送的就是一连串的字节(没有数据包的概念),因...

1689
来自专栏青玉伏案

PHP关于web页面交互内容

1. 学php学了有一段时间了总结总结给大家分享一下 2. PHP中的引用 第一段程序: <?php $first_name="fir...

1848
来自专栏Golang语言社区

Golang语言学习-并发

goroutine: 由GO运行环境管理的轻量级线程 channel: 有类型的管道,操作符为 <- 数据流向箭头指向的方向 使用make(chan ...

26811
来自专栏FreeBuf

Hongcms 3.0.0后台SQL注入漏洞分析

* 本文作者:BlackWater,本文属FreeBuf原创奖励计划,未经许可禁止转载。

906
来自专栏deepcc

jquery插件开发模板

33010
来自专栏mathor

request.getPramamter()的用法

 action:目标地址,把请求交给谁处理;action可以不设置,也可以是空字符串(提交给自己处理)

751
来自专栏Android机动车

动态代理——从一知半解到恍然大悟

动态代理是Java常见的一种设计模式,很多文章都介绍了什么是代理、静态代理和动态代理的实现方式,然而这些都偏理论,一篇好的文章要让大家知道知识点的具体用处,本文...

412
来自专栏大内老A

[WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]

在《通过扩展自行实现服务授权》一文中,我通过自定义CallContextInitializer的方式在操作方法之前之前根据认证用户设置了当前线程的安全主体,从而...

1778
来自专栏喵了个咪的博客空间

PhalGo-Respones

PhalGo-Respones 在处理请求 Api 请求中 , 除了对 Request 之外最重要的就是 Response 了 , PhalGo 支持两种格式的...

34011

扫码关注云+社区