获取错误LNK2019:vS中未解析的外部符号@)!)在VC 6.0中编译正常

时间:2014-05-29 20:53:13

标签: c++ visual-studio-2010 visual-c++-2010

我正在尝试用VS2010 C ++编译器编译一个14岁的C ++程序(不要问为什么:()。我收到以下错误

错误10错误LNK2019:未解析的外部符号" public:__ thishisall CConfiguration :: CConfiguration(void)" (?? 0CConfiguration @@ QAE @ XZ)在函数中引用 " public:__ thiscall CWhoisService :: CWhoisService(void)" (?? 0CWhoisService @@ QAE @ XZ)

我有一个带有标题CWhoisService.h的cpp文件CWhoisService.cpp

CWhoisService.h:

class CWhoisService
{
public:
    HRESULT Initialize(const char * szServiceName, REFCLSID pMetricsCLSID);

CWhoisService();
~CWhoisService();
HRESULT CheckService();

protected:

    CConfiguration m_Configuration;    
protected:
    bool           m_bStartedEvenLog;
    bool           m_bStartedConfiguration;

private:
       //Don't want standard constructor to be called
};

CWhoisService.cpp

#include "ConfigurationLib.h"
#include "CWhoisService.h"

CWhoisService::CWhoisService():
    m_bStartedEvenLog(false),
    m_bStartedConfiguration(false) 
{

}
HRESULT CWhoisService::Initialize(const char * szServiceName, REFCLSID pMetricsCLSID)
{
    HRESULT hr = S_OK;
    //Initialize the configuration library
    hr = m_Configuration.Initialize(VERSION_COMPANY,VERSION_SYSTEM);

在cpp文件中引用并在CWhoisService.h之前包含的ConfigurationLib.h文件如下:

#ifndef _CONFIGURATION_MODULE
#define _CONFIGURATION_MODULE

class CConfigurationBase
{
public:
    CConfigurationBase() : m_bInitialized(false) {};
    virtual ~CConfigurationBase() {};

    virtual HRESULT Initialize(LPCTSTR szCompanyName, LPCTSTR szSystemName, LPCTSTR szGlobalMachineName = NULL) = 0;

    virtual bool IsInitialized() { return m_bInitialized;};

protected:
    bool m_bInitialized;            // True if the object has been initialized
};

class CConfiguration : public CConfigurationBase
{
public:
    CConfiguration();
    virtual ~CConfiguration();

    // Initialized some values for the class.  Must be called first!
    virtual HRESULT Initialize(LPCTSTR szCompanyName, LPCTSTR szSystemName, LPCTSTR szGlobalMachineName = NULL);

protected:
    // This is the function that actually goes about getting values from the registry
    // The other Get functions all call this one
    virtual HRESULT GetValue(HKEY hkeyBase, LPCTSTR szSectionName, LPCTSTR szValueName, CString * csValue, DWORD * pdwValue, DWORD dwType);  
}; // CConfiguration
#endif // _CONFIGURATION_MODULE
上次大约10年前编译时,一切都很好。但现在它似乎没有找到ConfigurationLib.h文件。我确保它是项目的一部分。如果我从cpp文件的开头删除它我得到错误:缺少&#39 ;;'在标识符之前' m_Configuration'所以显然可以看到它。但它似乎无法解决这个问题。

任何帮助都会受到赞赏,我已经在这个网站上花了3天时间而且还有很多其他人没有进展。

2 个答案:

答案 0 :(得分:5)

i have spend last 3 days on this site and many others but no progress

了解Visual C ++链接器产生的错误总是很好的。然后下次看到这样的错误时,不应该花3天时间搞清楚。我知道这条消息一开始看起来很乱,但如果你知道要找什么,那真的不是。

诀窍是选择有意义的错误部分,并跳过名称错误(看起来像链接器的gobbledy-gook正在咒骂你)。有时名称修改是有用的,但对于您的错误,它并不重要。

让我们来看看错误:

unresolved external symbol "public: __thiscall CConfiguration::CConfiguration(void)"

上面的行表示链接器无法找到的函数实现。该函数是CConfiguration::CConfiguration(void)。换句话说,链接器无法找到CConfiguration的0参数构造函数。

错误消息的下一部分说明:

referenced in function "public: __thiscall CWhoisService::CWhoisService(void)"

这是试图调用CConfiguration构造函数的函数。它是CWhoisService::CWhoisService(void)构造函数。你在这里看到它:

class CWhoisService
{
  //...
protected:
     CConfiguration m_Configuration;  
};

您的成员是CConfiguration(m_Configuration),因此当您实例化CWhoIsService时,您还要实例化CConfiguration对象。

底线是链接器无法找到不带参数的CConfiguration构造函数的实现。

你要么

  1. 没有将源模块添加到包含项目CConfiguration构造函数实现的项目中,或者
  2. CConfiguration构造函数位于库中,您没有在项目中指定要链接的库,或者
  3. 您只是简单地没有编写没有参数的CConfiguration构造函数,或
  4. 导致链接器遗漏包含构造函数实现的代码的其他一些未知问题。
  5. 我的猜测很可能是上面的1.项。

    此外,这与头文件无关。头文件允许编译模块而不会出错。它保证链接器将成功链接。

    例如,您可以拥有一个包含对不存在的函数的调用的模块,但该模块将成功编译。但是,在链接时,如果调用的函数实际上不存在,那么然后就会出现错误(正如您现在看到的那样)。

答案 1 :(得分:1)

至少在你展示的代码片段中没有构造函数定义。它只被声明

class CConfiguration : public CConfigurationBase
{
public:
    CConfiguration();
//...