MFC visual c++ LNK2019 link 错误

MFC visual c++ LNK2019 link error

我只是不明白为什么我可以在 class 上使用 public 变量,但在尝试使用 getLicenceRefused 方法时出现 link 错误。我不确定问题是否是因为我之前遇到的CString复制构造函数问题所以把参数去掉了,但我仍然得到同样的错误。

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

我已经尽量做到全面,如果我遗漏了一些重要的东西或包含了太多内容,我深表歉意。

我只是偶尔使用 c++(很抱歉,如果我的术语是基于 java 的),因为它正在维护旧代码,这里没有人使用 c++ 来维持他们的技能水平。 两个 classes 都是内部 classes(由现在离开的人写的:)),两个 classes 在同一个解决方案的不同项目中。 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定义

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;
};

class 正文(我无法包含整个文件,因为它超过 1000 行并且包含几个 classes):

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)

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

您必须告诉 linker link 使用哪个库或目标文件来引入该机器代码。

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


附录:在我写完上面的内容后,OP 提供了 class.

的源代码

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