一次工程配置不匹配引起的调试大坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 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,这就造成了实际在内存中加载了两个库,每个库一个实例,造成了之前的奇怪现象。


猜你喜欢

转载自blog.csdn.net/jewelsu/article/details/80814348