Probleme de legătură (VC6)

Am deschis un spațiu de lucru vechi, care este un libray și hamul de test. Acesta funcționa bine, dar acum nu și versiunile mai vechi ale codului nu funcționează nici cu aceleași erori. Am incercat recrearea proiectului si asta cauzeaza aceleasi erori. Nimic nu pare a fi în ordine în setările proiectului, iar codul generat funcționează în aplicația principală.

Am eliminat majoritatea fișierelor și le-am scos la minim pentru a genera eroarea. Din păcate, nu pot posta proiectul, deoarece acesta este folosit în codul de producție.

Lecția de legătură LNK2001 pe care o primesc de obicei înseamnă că am părăsit o bibliotecă sau am uitat să implementez o funcție virtuală. Totuși, aceasta face parte din biblioteca standard de șabloane - și este un antet la asta.

Codul care este listat ca având problema în IOCompletionPort.obj nu folosește de fapt , ci numește o clasă care face: Comms :: Exception acceptă un std :: string și valoarea GetLastError sau WSAGetLastError .

Funcția menționată în eroare ( GetMessage ) este implementată, însă este o funcție virtuală, astfel încât alte clase să o înlocuiască dacă este cazul. Totuși, se pare că compilatorul a făcut-o ca o versiune Ansi, dar nu găsesc vreo opțiune în setările care ar controla asta. Bănuiesc că ar putea fi problema, dar din moment ce există foarte puține opțiuni pentru bibliotecă, nu am cum să știu sigur. Cu toate acestea, ambele proiecte să specificați _MBCS în opțiunile de compilator.

--------------------Configuration: TestComms - Win32 Debug-------------------- Linking... Comms.lib(IOCompletionPort.obj) : error LNK2001: unresolved external symbol "public: virtual class std::basic_string,class std::allocator > __thiscall Comms::Exception::GetMessageA(void)const " ([email protected] [email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ) Debug/TestComms.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.

TestComms.exe - 2 error(s), 0 warning(s)

Orice sugestii? Am pierdut majoritatea dimineții și nu vreau să pierd majoritatea după-amiezii.

0
fr hi bn

5 răspunsuri

windows.h este declarat în partea de sus a IOCompletionPort.h ca o include - am fost bolnav de a vedea 7 linii doar pentru a include un fișier, așa că am înfășurat propriul fișier și include în sine. Acest lucru conține, de asemenea, unele #define suplimentare (adică ULONG_PTR), deoarece aplicația noastră principală nu se va compila cu platforma SDK instalată :-(

  1. Asta este confirmat. Nimic nu este în afara locului.
  2. Am făcut-o - a șters directoarele de construire
  3. Nu folosesc niciodată căi codificate greu.
0
adăugat

@Curt: Cred că ați venit cel mai aproape. Nu am testat acest lucru, dar cred că am dat un răspuns în întrebarea mea inițială.

GetMessage is a define in Windows.h wrapped in a ifndef block to switch between Ansi (GetMessageA) and Unicode (GetMessageW).

0
adăugat

Presupunând că nu ați trecut pe loc cu setările proiectului ștergând ceva ce nu ar trebui să aveți (unde se așteaptă ca dependențele externe ca User32.lib să fie):

Verificați Instrumentele | Opțiuni | Directoare | Bibliotecile (mergând din memoria de aici) și asigurați-vă că nu vă lipsesc directoarele lib libere din comun (din nou, fără VC6 în fața mea, nu vă pot spune ce sunt)

0
adăugat

Aceasta este o problemă generală cu modul în care Microsoft a gestionat API-urile ANSI vs. Unicode. Deoarece acestea sunt toate (sau aproape toate) realizate prin definirea macrocomenzilor pentru numele funcțiilor care rezolvă versiunile "A" sau "W" ale denumirilor funcțiilor, nu puteți avea sigur un identificator în spațiul / class / struct / enum / care corespunde unui nume de API Windows.

Macros-urile windows.h rulează rușinos peste toate celelalte spații de nume.

0
adăugat

O posibilitate constă în "nume-mangling" ANSI / Unicode, care transformă simbolul GetMessage în GetMessageA sau GetMessageW . Există trei posibilități:

  1. Windows.h nu a fost încărcat, deci GetMessage rămâne GetMessage

  2. Windows.h a fost încărcat cu simboluri stabilite pentru ANSI, astfel încât GetMessage devine GetMessageA

  3. Windows.h a fost încărcat cu simboluri setate pentru Unicode, astfel încât GetMessage devine GetMessageW

Dacă ați compilat două fișiere diferite în moduri care declanșează două scenarii diferite, veți obține o eroare de linker. Mesajul de eroare indică faptul că clasa Comms :: Exception a fost o instanță de # 2, de mai sus - poate că este folosită undeva unde windows.h nu a fost încărcat?

Alte lucruri pe care le-aș face în locul tău, ca și rutină:

1) Asigurați-vă că căile mele de includere și biblioteca nu conțin nimic despre care nu mă aștept.

2) Faceți o "construire curată" și apoi verificați-o manual, ștergând orice fișier extra obiect, dacă este necesar.

3) Asigurați-vă că nu există niciun fel de căi de tip hardcoded care să includă instrucțiuni care nu înseamnă ce au însemnat atunci când proiectul a fost inițial reconstruit.

EDIT: Lupta cu formatul :(

0
adăugat