今天因为项目原因需要将ubuntu下的工程移植到windows平台。在ubuntu下面我们使用的是qmake来构建的工程,在windows上面移植的时候,将工程构建软件替换为cmake。

在移植的时候,也在吐槽windows的版本管理,什么vs2013的库不能用于vs2015编译链接,debug版本不能链接release版本之类的设定。我反正觉得这些设定挺奇葩的,在实际情况中,我们常常需要链接一些第三方库,如果是外部人员提供的话,那么就会只有release版本,调试起来就很难受了。

在移植成功后遇到了一个问题,这个问题折腾了我还比较久的时间。就是在我们工程中自己编写的动态库dll中需要导出类。而在我们类是用单例做成的。所以要导出的类中有一个静态成员变量。在主程序链接的时候一直报错,没有找到该静态变量。

代码结构类似这样:

dll h文件

#pragma once#include "stdio.h"
#ifdef _DLL_INNER
#define _EXPORT _declspec(dllexport)
#else
#define _EXPORT _declspec(dllexport)
//#define _EXPORT _declspec(dllimport)
#endif
class _EXPORT ss
{
public:static ss * Ins(){if (m_ss){}else{m_ss = new ss;}printf("addr :%x\n", m_ss);return m_ss;}
private:static ss * m_ss;int aal;
};

dll cpp文件类似这种

#define  _DLL_INNER
#include "defs.h"
#include "stdio.h"
ss * ss::m_ss=0;

主程序 cpp类似这种

#include "defs.h"
#include "stdio.h"
int main(int argc, char * argv[])
{ss *a = ss::Ins();printf("addr: %x\n",a);getchar();
}

在这种情况下编译vs2015给我报了

错误 LNK2001 无法解析的外部符号 "private: static class ss * ss::m_ss" (?m_ss@ss@@0PEAV1@EA) teststatic c:\Users\zheng\documents\visual studio 2015\Projects\teststatic\teststatic\teSt.obj 1

针对于此问题,我能想到的是dll数据段和主程序数据段不通用。于是乎想弄dll共享的数据段,结果也没有解决这个问题。还有关于导出符号

#define _EXPORT _declspec(dllexport)
#define _EXPORT _declspec(dllimport)

正反也测试了好多次,也是没有解决这个问题。后来无意间将 dll的文件结构改成如下所示,问题才得以解决:

dll h文件

#pragma once#include "stdio.h"
#ifdef _DLL_INNER
#define _EXPORT _declspec(dllexport)
#else
#define _EXPORT _declspec(dllexport)
//#define _EXPORT _declspec(dllimport)
#endif
class _EXPORT ss
{
public:static ss * Ins();
private:static ss * m_ss;int aal;
};

dll cpp文件:

#pragma once#include "stdio.h"
#ifdef _DLL_INNER
#define _EXPORT _declspec(dllexport)
#else
#define _EXPORT _declspec(dllexport)
//#define _EXPORT _declspec(dllimport)
#endif
class _EXPORT ss
{
public:static ss * Ins();
private:static ss * m_ss;int aal;
};

之后问题解决。

总结:函数实现还是放在cpp文件规范比较好。

C++ 导出dll 类成员变量问题debug记录相关推荐

  1. C++---类成员变量定义为引用

    C++---类成员变量定义为引用 摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必 ...

  2. 使用Mockito对类成员变量进行Mock

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Mock ...

  3. java实例成员和类成员变量_Java 中成员变量又分为 和类成员变量。_学小易找答案...

    [简答题]I'm not quite so poetic, but I do know that the subway is as essential to the character of New ...

  4. 编写Java程序,创建Dota游戏中的兵营类,兵营类有一个类成员变量count、一个实例变量name和另一个实例变量selfCount。

    返回本章节 返回作业目录 需求说明: 创建Dota游戏中的兵营类 兵营类有一个类成员变量count.一个实例变量name和另一个实例变量selfCount. count表示的是兵营已经创建士兵的总数: ...

  5. java实例变量成员变量_Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法...

    总是被这些相似的概念搞晕,查阅了资料后做个小总结,以变量为例,方法辨析类似. 1.多胞胎名字汇总辨析 成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称, ...

  6. 【Kotlin】Kotlin 面向对象 ( 类 | 成员变量 | 成员方法 | 封装 | 继承 | 多态 )

    文章目录 I . 创建简单类 ( 整型字段 ) II . 创建简单类 ( 整型字段 + 字符串字段 ) III . 类方法定义 IV . 封装 V . 继承 VI . 多态 与 抽象类 I . 创建简 ...

  7. 【C++】38.类成员变量声明为 对象与指针的区别

    在我们平时写代码或阅读代码时,经常会看到,某个类A中需要使用另一个类B的方法.那么下面会看到两种用法: 一种是直接定义一个B类对象. 一种是在类A中定义一个B类指针: 如: // 头文件 std::s ...

  8. 【转】Java类成员变量默认初始化规则

    一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: -------------------------------------------------------------- ...

  9. python类成员变量_Python 类变量和成员变量

    Python 类变量和成员变量 类与对象的方法 我们已经讨论了类与对象的功能部分,现在我们来看一下它的数据部分.事实上,它们只是与类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提 ...

最新文章

  1. 爬取--- https://www.exploit-db.com/ 下载POC较完善的代码【2】
  2. 图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting
  3. priority queue
  4. Linux解压有思路
  5. stl-优先队列priority_queue
  6. boost::hana::trait用法的测试程序
  7. 第三课 Makefile文件的制作(上)
  8. Java编程程序异常处理方法
  9. python自带的集成开发工具是什么_python内置的集成开发工具是什么
  10. Linux(1) 目录结构
  11. 【java笔记】成员内部类 局部内部类 匿名内部类
  12. [BZOJ1934/Luogu2057][SHOI2007]Vote 善意的投票 题解
  13. python图像边缘检测报告_python计算机视觉2:图像边缘检测
  14. PingFang(苹方)字体的引用
  15. 深入浅出数据分析(美 完整中文版)米尔顿
  16. 《Go程序设计语言》- 第11章:测试
  17. Mac苹果电脑Matlab2018a和2020a下载及安装(linux和win也有,但是没试)
  18. 思维导图一定要用计算机来完成吗,程序猿不仅可以用电脑敲代码,还可以用来制作思维导图...
  19. 差分 线宽 线距_线宽、线距规则设置到底怎样最合适?
  20. 网页完整的长截图怎么截?3步搞定!

热门文章

  1. Unity制作二次元卡通渲染角色材质——4 、内外描边和细节添加
  2. Opencv教程(一) 安装和配置
  3. 小程序云开发之云函数的使用
  4. 如何防止因哈希碰撞引起的DoS攻击
  5. 基于JAVA医院门诊管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  6. Google Earth Engine(GEE)——缩放错误(计算超时、聚合过多、内存溢出)
  7. 金晓龙获批担任蚂蚁消金董事长,年内多家消费金融公司一把手换人
  8. 长度短点的uuid_如何减少使用randomUUID()生成的UUID的长度
  9. C++实现同或 详解bitset
  10. 物流查询,怎么查快递单号看包裹走到哪里了