Cum să rezolv acesta erroare: class ATL::CStringT...

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
giquem
Junior
Junior
Posts: 1
Joined: 07 Aug 2014, 14:54

Cum să rezolv acesta erroare: class ATL::CStringT...

Post by giquem » 07 Aug 2014, 15:53

Salve, Ovidiu. Am văzut numele tău la Codeguru intr un post în legatura cu problema pe care o am. Încerc să fac compilarea conoscutului program eMule şi am ajuns la final cu toate acesta:

Vinculando...
ClientList.obj : error LNK2001: símbolo externo "public: void __thiscall CUpDownClient::ResetIP2Country(unsigned int)" (?ResetIP2Country@CUpDownClient@@QAEXI@Z) sin resolver
URLClient.obj : error LNK2001: símbolo externo "public: void __thiscall CUpDownClient::ResetIP2Country(unsigned int)" (?ResetIP2Country@CUpDownClient@@QAEXI@Z) sin resolver
ClientListCtrl.obj : error LNK2001: símbolo externo "public: class ATL::CStringT<wchar_t,class StrTraitMFC<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > __thiscall CUpDownClient::GetCountryName(bool)const " (?GetCountryName@CUpDownClient@@QBE?AV?$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@_N@Z) sin resolver
DownloadClientsCtrl.obj : error LNK2001: símbolo externo "public: class ATL::CStringT<wchar_t,class StrTraitMFC<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > __thiscall CUpDownClient::GetCountryName(bool)const " (?GetCountryName@CUpDownClient@@QBE?AV?$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@_N@Z) sin resolver
QueueListCtrl.obj : error LNK2001: símbolo externo "public: class ATL::CStringT<wchar_t,class StrTraitMFC<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > __thiscall CUpDownClient::GetCountryName(bool)const " (?GetCountryName@CUpDownClient@@QBE?AV?$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@_N@Z) sin resolver
ClientListCtrl.obj : error LNK2001: símbolo externo "public: int __thiscall CUpDownClient::GetCountryFlagIndex(void)const " (?GetCountryFlagIndex@CUpDownClient@@QBEHXZ) sin resolver
DownloadClientsCtrl.obj : error LNK2001: símbolo externo "public: int __thiscall CUpDownClient::GetCountryFlagIndex(void)const " (?GetCountryFlagIndex@CUpDownClient@@QBEHXZ) sin resolver
QueueListCtrl.obj : error LNK2001: símbolo externo "public: int __thiscall CUpDownClient::GetCountryFlagIndex(void)const " (?GetCountryFlagIndex@CUpDownClient@@QBEHXZ) sin resolver
Release_vc9\emule.exe : fatal error LNK1120: 3 externos sin resolver

Se pare că nu sunt errori de LINK propiu zis, şi errori provocaţi de CString. Cum aş putea scapa de ele şi obţine emule.exe?
Mai multe informaţii:
--VS 2008
--Release Win32
--Utilizar MFC en una biblioteca estática
--No utilizar ATL
--Multiproceso (/MT)
--Fişierul Updownclient.h conţine aceste linii:
public:
CString GetCountryName(bool longName = false) const;
int GetCountryFlagIndex() const;
void ResetIP2Country(uint32 dwIP = 0);
--Toate fişierele citate au un #include "UpDownClient.h"
Cu toate, linkul nu se face.
Aş fi reconuscător dacă m-ai putea ajuta.



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum să rezolv acesta erroare: class ATL::CStringT...

Post by Ovidiu Cucu » 31 Aug 2014, 11:17

[...]
Se pare că nu sunt errori de LINK propiu zis, şi errori provocaţi de CString.
LNK2001 este eroare de linker (cat se poate de) "propriu-zis" si nu (neaparat) "provocata de CString". :)
De altfel, daca ne uitam la lista cu erori, CUpDownClient::GetCountryFlagIndex si CUpDownClient::ResetIP2Country n-au nici o treaba cu CString.
Cel mai probabil (uitandu-ma si la cum e structurat proiectul eMule), ai declarate metodele respective in UpDownClient.h insa iti lipseste implementarea (definitia) lor.
Sau folosesti un header de la o versiune mai noua si un lib de la alta mai veche, care nu contine functiile cu pricina.
Si-or mai fi...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum să rezolv acesta erroare: class ATL::CStringT...

Post by Ovidiu Cucu » 31 Aug 2014, 13:00

Un pic mai mult despre CString (CStringT) si problemele care pot sa apara

Daca aruncam o privire in afxstr.h gasim ceva de genul:

Code: Select all

#if defined(_AFXDLL)

// ...

typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;

#else

typedef ATL::CStringT< wchar_t, StrTraitMFC< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;

#endif	// !_WIN64 && _AFXDLL
Asta inseamna ca, avem implementari diferite pentru CString daca este definit sau nu _AFXDLL in proiectul nostru.
_AFXDLL este definit daca in proiect avem setata optiunea "Use MFC in a Shared DLL".
Daca, de exemplu, exportam dintr-un DLL o functie care foloseste CString, proiectul acelui DLL are setat Use MFC in a Static Library iar proiectul care importa are Use MFC in a Shared Library sau viceversa, atunci linker-ul da eroare LNK2019 (unresolved external symbol).

Deci, asadar si prin urmare trebuie consintenta la aceasta setare intre module (proiecte). Sau ambele au Use MFC in a Shared DLL sau ambele au Use MFC in a Static Library sau ambele nu utilizeaza MFC (au setat Use Standard Windows Libraries si includ doar <atlstr.h>).

Acuma, nu pot decat sa banuiesc ce-i la tine...

Pentru a vedea mai bine ce-i si cum cu acest CStringT nu strica sa aruncam o privire mai atenta si in documentatia din MSDN: http://msdn.microsoft.com/en-us/library ... s.90).aspx.

Post Reply