不能在多个DLL的头中定义单个对象

时间:2013-07-05 12:21:06

标签: c++ visual-c++

我在使用2个DLLS的解决方案上使用VS2010,我正在尝试定义要在两个DLLS中使用的全局变量。

我有以下代码:

header.h
        namespace A
        {   
            extern DLL_A int myInt;
        }

在DLL A中的a.cpp文件中:

#include "header.h"
using namespace A;

DLL_A int A::myInt = 5; //initialisation

在DLL A中的另一个b.cpp文件中:

#include "header.h"
using namespace A;
//use myInt for computations in some method, eg myInt++; etc

DLL_A被定义为通常的:

#ifdef SOME_DEFINE
#       define DLL_A __declspec(dllexport)
#   else
#       define DLL_A __declspec(dllimport)
#   endif

然而,在b.cpp中进行调试时,我会在监视窗口中看到& A :: myInt和& myInt是不同的,这意味着(未知)“myInt”变量用于计算,而A :: myInt正确初始化为5。

有人可以向我解释发生了什么以及如何解决这个问题?我没有看到如何正确链接,因为我创建了两个不同的外部变量,我只初始化一个。

编辑:

如果我改变

DLL_A int A::myInt = 5; //initialisation

DLL_A int myInt = 5; //initialisation

它不会链接

感谢

1 个答案:

答案 0 :(得分:1)

你说“我在观察窗口看到& A :: myInt和& myInt是不同的,这意味着(未知)”myInt“变量用于计算”。

确实存在问题。 using namespace A;表示在查找在当前(即全局)命名空间中失败后,myInt只会在<{1}}中查找A这样的非限定名称。但调试器显示::myInt存在。因此,myInt表示::myInt,第一次查找成功,而::A::myInt没有进行第二次查找。