版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jewelsu/article/details/80814348
最近调试程序遇到一个特别诡异的问题。
程序的结构如下:有一个主程序demomain.exe,依赖于两个库modbase和modcomm,其中modbase又依赖于modcomm。并且modcomm在程序中只使用一个实例。示例代码如下:
modcomm.h
#ifndef MODCOMM_H_INCLUDED_
#define MODCOMM_H_INCLUDED_
#ifndef COMM_API
#ifdef MODCOMM_EXPORTS
#define COMM_API __declspec(dllexport)
#else
#define COMM_API __declspec(dllimport)
#endif
#endif
class Modcomm
{
public:
COMM_API ~Modcomm();
public:
COMM_API static Modcomm* instance();
COMM_API void go();
COMM_API void add();
private:
// You cannot create any object of EioLayer by yourself, the only instance is ms_EioLayer.
Modcomm( );
int count;
static Modcomm ms_ins;
};
#endif
modcomm.cpp
// modcomm.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "stdio.h"
#include "modcomm.h"
Modcomm Modcomm::ms_ins;
Modcomm::Modcomm( )
{
count=0;
}
Modcomm::~Modcomm( )
{
}
void Modcomm::go()
{
if(count>0)
printf("good\n");
else
printf("bad\n");
}
void Modcomm::add()
{
count++;
}
Modcomm* Modcomm::instance()
{
return &ms_ins;
}
modbase.h
#ifndef MODBASE_H_INCLUDED_
#define MODBASE_H_INCLUDED_
#ifndef BASE_API
#ifdef MODBASE_EXPORTS
#define BASE_API __declspec(dllexport)
#else
#define BASE_API __declspec(dllimport)
#endif
#endif
class Modbase
{
public:
BASE_API ~Modbase();
BASE_API Modbase();
BASE_API void basego();
};
#endif
modbase.cpp
// modbase.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "modbase.h"
#include "modcomm.h"
Modbase::Modbase()
{
}
void Modbase::basego()
{
Modcomm::instance()->go();
}
Modbase::~Modbase()
{
}
demomain.cpp
#include "demomain.h"
#include "modbase.h"
#include "modcomm.h"
int main()
{
Modcomm::instance()->add();
Modbase base;
base.basego();
getchar();
}
由demomain里为modcomm的实例中count数据加一,然后modbase库调用modcomm的实例,判断如果count>0就打印good,否则打印bad。
可是在调试的过程中每次都输出时bad。
于是开启了头大的调试过程。
在modcomm的add函数处断点,确实进了,count是1。
在modcomm的go函数处断点,也进去了,count是0.
这怎么感觉两次进去的不是一个实例啊,
于是在modcomm的构造函数处打断点,果然进了两次。
应该只会进一次才对啊。
这是看了一下调试界面的“模块”,怎么有两个modcomm,一个是modcommD.dll一个是modcomm.dll。
终于找到了原因。
、、、、、、、、、、、、、、、、、、、、、、、、
原来在工程配置的时候改过一次,把debug版的modcomm生成的文件改成了modcommD.dll,demomain项目的附加依赖库也改成了modcommD.lib,但是modbase的附加依赖库却还是modcomm.lib,这就造成了实际在内存中加载了两个库,每个库一个实例,造成了之前的奇怪现象。