我正在尝试用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天时间而且还有很多其他人没有进展。
答案 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
构造函数的实现。
你要么
CConfiguration
构造函数实现的项目中,或者CConfiguration
构造函数位于库中,您没有在项目中指定要链接的库,或者CConfiguration
构造函数,或我的猜测很可能是上面的1.
项。
此外,这与头文件无关。头文件允许编译模块而不会出错。它不保证链接器将成功链接。
例如,您可以拥有一个包含对不存在的函数的调用的模块,但该模块将成功编译。但是,在链接时,如果调用的函数实际上不存在,那么然后就会出现错误(正如您现在看到的那样)。
答案 1 :(得分:1)
至少在你展示的代码片段中没有构造函数定义。它只被声明
class CConfiguration : public CConfigurationBase
{
public:
CConfiguration();
//...