Domanda

Durante la creazione di progetti in C++, ho riscontrato che il debug degli errori di collegamento è complicato, soprattutto quando si raccoglie il codice di altre persone.Quali strategie utilizzano le persone per eseguire il debug e correggere gli errori di collegamento?

È stato utile?

Soluzione

Non sono sicuro di quale sia il tuo livello di esperienza, ma ecco le nozioni di base.

Di seguito è riportato un errore del linker di VS 2005: sì, è un gran pasticcio se non lo conosci.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

Ci sono un paio di punti su cui concentrarsi:

  • "ByteComparator.obj" - Cerca un file ByteComparator.cpp, questa è l'origine del problema del linker
  • "int __cdecl Does_not_exist(void)" - Questo è il simbolo che non è riuscito a trovare, in questo caso una funzione denominata Does_not_exist()

A questo punto, in molti casi il modo più rapido per risolvere il problema è cercare nel codice base questa funzione e trovare dove si trova l'implementazione.Una volta che sai dove è implementata la funzione devi solo assicurarti che i due luoghi siano collegati tra loro.

Se utilizzi VS2005, utilizzerai il menu di scelta rapida "Dipendenze progetto...".Se stai usando gcc, dovresti cercare nei tuoi makefile il passaggio di generazione dell'eseguibile (gcc chiamato con un gruppo di file .o) e aggiungere il file .o mancante.


In un secondo scenario, potrebbe mancare una dipendenza "esterna", per la quale non disponi di codice.Le librerie Win32 sono spesso implementate in librerie statiche a cui è necessario collegarsi.In questo caso, vai a MSDN O "Microsoft Google" e cercare l'API.In fondo alla descrizione dell'API viene fornito il nome della libreria.Aggiungilo all'elenco "Proprietà di configurazione->Linker->Input->Dipendenze aggiuntive" delle proprietà del tuo progetto.Ad esempio, la funzione timeGetTime()'s pagina su MSDN ti dice di usare Winmm.lib in fondo alla pagina.

Altri suggerimenti

Le librerie C-runtime sono spesso il principale colpevole.Assicurati che tutti i tuoi progetti abbiano le stesse impostazioni rispetto a single vs multi-threading e statico vs dll.

La documentazione MSDN è utile per indicare quale libreria richiede una particolare chiamata API Win32 se risulta mancante.

A parte questo, di solito si tratta di attivare la bandiera dettagliata e sfogliare l'output alla ricerca di indizi.

Uno degli errori di collegamento più comuni in cui mi sono imbattuto è quando una funzione viene utilizzata in modo diverso da come è definita.Se vedi un errore del genere dovresti assicurarti che ogni funzione che usi sia dichiarata correttamente in qualche file .h.
Dovresti anche assicurarti che tutti i file sorgente rilevanti siano compilati nello stesso file lib.Un errore in cui mi sono imbattuto è quando ho due set di file compilati in due librerie separate e eseguo chiamate incrociate tra librerie.

C'è un fallimento che hai in mente?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top