C ++和CriticalSections中的全局变量

时间:2014-04-14 20:44:20

标签: c++ multithreading global-variables

我有几个全局关键部分需要在3个或更多.cpp文件中定义的3个或更多个类的可见性。它们在h文件中定义为:

GlobalCS.h

#pragma once
#include "stdafx.h"
extern CRITICAL_SECTION g_cs1;
extern CRITICAL_SECTION g_cs2;
etc...

在GlobalCS.cpp中定义了它们

#include "stdafx.h"
#include "GlobalCS.h"
CRITICAL_SECTION g_cs1;
CRITICAL_SECTION g_cs2;

然后在他们需要工作的类的cpp中,它们被包含在

#include "stdafx.h"
#include "GlobalCS.h"

链接器抱怨在使用关键部分的文件中提供未解析的外部。我没想到这个,因为变量被定义为extern。我做错了什么或如何解决这个问题?

错误LNK2001:未解析的外部符号“struct _RTL_CRITICAL_SECTION g_CS_SymbolStrPlotAccess”(?g_CS_SymbolStrPlotAccess @@ 3U_RTL_CRITICAL_SECTION @@ A)

2 个答案:

答案 0 :(得分:1)

不确定为什么会收到错误。我在Visual Studio和_tmain函数中尝试了同样的事情,我写了以下内容:

int _tmain(int argc, _TCHAR* argv[])
{
    //::g_cs1;
    ZeroMemory(&g_cs1, sizeof(::g_cs1));

    return 0;
}

它构建时没有任何问题。

答案 1 :(得分:0)

谢谢大家的帮助。进行健全性检查总是有帮助的。问题再次是Visual Studio设置。如果不喜欢将文件添加到项目中的方式,Visual Studio将生成链接错误。这是我遇到的第二个错误,它根据项目的配置方式生成链接错误。如果重要的是,VS应该阻止您以有害的方式修改项目或提供正确的错误消息。

无论如何,错误与此错误相同:

LNK2019 Error under Visual Studio 2010

我在源目录中有GlobalCS.h和GlobalCS.cpp。我更喜欢这种方式,因为我发现它可以更快地查找文件和代码,并且在一个大型的c ++项目中,只需移动代码库就可以节省大量时间。如果IDE旨在帮助更快地找到代码,那么编写c ++代码可以节省很多时间。 2012年比2010年好很多,所以我会给MSFT,但是可能会有更多的功能(现在VS已经存在近20年了)这些类型的持久性问题只是妨碍了开发。当我将GlobalCS.h移动到Header文件夹并清理项目并重建时,所有内容都按预期编译。当.h文件在代码目录中时(因为#includes工作)而不是在项目中,VS将向你抛出的另一个类似错误。当发生这种情况时,我收到了相同的错误消息,并且需要花费很多时间来确定这一点。在一个小项目中,它可能不会有问题,但在具有多个项目和几十个文件的大解决方案中,它可能会有问题。