MFC visual c ++ LNK2019链接错误

时间:2015-06-22 16:51:30

标签: c++ mfc

我只是不明白为什么我可以在类上使用公共变量,但在尝试使用getLicenceRefused方法时会出现链接错误。我不确定问题是否是因为我之前遇到的CString拷贝构造函数问题所以把参数拿出来了,但我仍然遇到了同样的错误。

所以这个类正在被编译和链接(因为我可以使用成员变量),当我尝试调用任何函数时,我得到了这个错误。

如果我错过了一些重要的内容或包含太多内容,我会尽量保持全面的抱歉。

我只偶尔做c ++(很抱歉,如果我的术语是基于java的),因为它维护旧代码,没有人在这里使用c ++来维持他们的技能水平。 这两个类都是内部类(由现在已经离开的人编写:)),这两个类在同一个解决方案中的不同项目中。 ConfigurationDialog项目依赖于CServerSettings项目。 这是我的主叫代码

int CConfigurationDialog::testConnection(CString connectionName, CString origin)
{
  CServerConnection* connection = getConnection();

  // these 2 lines of code work and return the correct result, it is the body of the function with problems
  auto result = connection->m_licencesRefused.find(origin);
  bool connRefused =  (result != connection->m_licencesRefused.end());

  if(connection->getLicenceRefused(origin)) // this is the line with the link error

班级定义

class CServerConnection
{
    public:
        CServerConnection();
        CServerConnection( LPCTSTR connectionName );

        void setLicenceRefused(CString origin, bool value);
        bool getLicenceRefused(CString origin);
        void setLicenceRequested(CString origin, bool value);
        bool getLicenceRequested(CString origin);
        void clearAllLicences();
        CString getLoggedOnOrigin();
        void setURLNotFound(bool notFound);
        bool getURLNotFound();

    public:
        bool m_initialised;
        CString m_connectionName;
        CString m_lastError;
        CString m_password;
        CString m_company;
        CString m_username;
        CString m_sessionID;

    public:
        std::set<CString> m_licencesRefused;

        bool m_urlNotFound;
};

类主体(我不能包含整个文件,因为它超过1000行并包含几个类):

CServerConnection::CServerConnection(LPCTSTR connectionName)
{
    m_initialised = false;
    m_connectionName = connectionName;
    m_lastError = _T( "" );
    m_urlNotFound = false;
}

CServerConnection::CServerConnection()
{
    m_initialised = false;
    m_connectionName = _T( "" );
    m_lastError = _T( "" );
    m_urlNotFound = false;
}

void CServerConnection::setLicenceRefused(CString origin, bool value)
{
    if(value)
    {
        m_licencesRefused.insert(origin);
    }
    else
    {
        m_licencesRefused.erase(origin);
    }
}

bool CServerConnection::getLicenceRefused(CString origin)
{
    auto result = m_licencesRefused.find(origin);
    return (result != m_licencesRefused.end());
}

void CServerConnection::setLicenceRequested(CString origin, bool value)
{
    if(value)
    {
        m_licencesRequested.insert(origin);
    }
    else
    {
        m_licencesRequested.erase(origin);
    }
}

bool CServerConnection::getLicenceRequested(CString origin)
{
    auto result = m_licencesRequested.find(origin);
    return (result != m_licencesRequested.end());
}

void CServerConnection::clearAllLicences()
{
    m_licencesRefused.clear();
    setLicenceRefused(XL_FINANCE_ORIGIN, false);
    setLicenceRefused(XL_POP_ORIGIN, false);

    m_licencesRequested.clear();
    setLicenceRequested(XL_FINANCE_ORIGIN, false);
    setLicenceRequested(XL_POP_ORIGIN, false);
}

CString CServerConnection::getLoggedOnOrigin()
{
    if(getLicenceRequested(XL_FINANCE_ORIGIN) && !getLicenceRefused(XL_FINANCE_ORIGIN))
    {
        return XL_FINANCE_ORIGIN;
    }

    if(getLicenceRequested(XL_POP_ORIGIN) && !getLicenceRefused(XL_POP_ORIGIN))
    {
        return XL_POP_ORIGIN;
    }

    return _T("");
}

void CServerConnection::setURLNotFound(bool notFound)
{
    m_urlNotFound = notFound;
}

bool CServerConnection::getURLNotFound()
{
    return m_urlNotFound;
}

和错误:

 error LNK2019: unresolved external symbol "public: bool __thiscall CServerConnection::getLicenceRefused(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (?getLicenceRefused@CServerConnection@@QAE_NV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) referenced in function "private: int __thiscall CConfigurationDialog::testConnection(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >,class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (?testConnection@CConfigurationDialog@@AAEHV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@0@Z)

1 个答案:

答案 0 :(得分:1)

头文件提供了足够的信息来让您声明变量。就此而言,只编译(但不是链接)代码。链接时,链接器必须解决,例如函数引用,例如对ServerConnection::getLicenceRefused的引用,通过引入相关的机器代码。

您必须告诉链接器链接哪个库或目标文件以引入该机器代码。

getLicenseRefused中的小写首字母表示它不是Microsoft代码,尽管它可能是从C ++访问的属性。除非熟悉这一点的人应该看到并做出回应,否则你必须自己弄清楚库或目标文件。通常这涉及查看文档,但根据情况,它可能就像向项目添加.cpp文件一样简单;不管。

附录:在我写完上述内容后,OP为该课程提供了源代码。

所以这可能只是将.cpp文件添加到项目中。