2010-11-08 22 views
5

Abbiamo un grande progetto che utilizza VS2008 e incrementa 1_42. Sto cercando di aggiornare a VS2010 e aumentare 1_44. Ho installato VS2010 e potenziato 1_44 e ho convertito il progetto. Ora sto cercando di costruire, e tutto viene compilato, ma non riesce quando si collegano:Perché VisualStudio sta cercando questo file lib? Errore LNK1104

LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-1_42.lib'

ho cambiato l'inclusione e lib per puntare a nuovi file spinta 1_44 e ho rinominato la vecchia directory spinta 1_42 .

Perché il linker sta ancora cercando un file vc90-1_42, quando utilizza solo intestazioni 1_44? C'è un modo per determinare perché il linker vuole questo file? Il linker ovviamente pensa che abbia bisogno del file, ma perché?

Ho pulito il progetto e sto ricostruendo per garantire che tutti i vecchi file di costruzione vengano cancellati.

+0

OK, quindi ho scoperto qual era il mio problema, ma vorrei ancora una risposta a "Come posso scoprire perché il linker vuole questo file?". Il mio progetto dipendeva da uno dei nostri file lib creati con boost 1_42. Ho ricompilato il file lib con boost 1_44 e l'errore del linker sul progetto principale è andato via. C'è qualche registro o utilità che avrei potuto vedere per vedere che stava succedendo? – JPhi1618

+0

Sono abbastanza sicuro che non ci sia. Questo tipo di informazioni ("need to link to some_lib") è probabilmente sepolto in profondità nei file generati obj e lib. –

risposta

3

Insieme alla modifica della directory lib, è necessario modificare il nome della libreria boost. Questo è nel linker | Sezione di input delle impostazioni del progetto.

Il commento aggiunto chiarisce che la dipendenza dalla libreria Boost 1.42 è stata creata indirettamente da un'altra libreria che non era stata ricostruita.

Per questo è necessario fondamentalmente due scelte: o aggiungere quella biblioteca come un progetto per la soluzione principale e assicurarsi che ha abbastanza informazioni sulle dipendenze che sarà ricostruito quando si aggiorna Boost, o utilizzare il compilatore /Zl cambia quando costruisci la tua biblioteca. Questo dice al compilatore che stai costruendo una libreria in modo da fare non vuoi incorporare dipendenze di libreria come questa.

+2

Boost utilizza il collegamento automatico, quindi non elencherò manualmente tutti i file nella sezione Linker | Input. – JPhi1618

0

Boost utilizza

#pragma comment(lib) 

comando per informare il linker di librerie ha bisogno di collegarsi con. Non è un errore Se Boost dice che ne hai bisogno, è probabile che lo fai.

+0

Sto dicendo che si tratta di un errore perché non c'è motivo per il potenziamento 1_44 sarebbe necessario un file lib boost 1_42. – JPhi1618

+0

Quindi potrebbe esserci un bug in Boost, ma ne dubito. –

+0

Credo che Jerry Coffin abbia ragione. Probabilmente hai una dipendenza da qualche altra libreria (fatta in casa o meno) che dipende dalla spinta 1.42. Da qui il problema del collegamento automatico che stai riscontrando. –

5

Ho incontrato esattamente questo problema anche un paio di volte. Di solito sono stati alcuni vecchi file temporanei, ma come nel tuo caso la pulizia non è sempre stata immediata. Il tuo progetto include librerie statiche che potrebbero essere state costruite con 1.42?

Qualcosa si può provare che può o non può essere utile per rintracciare il problema: Rinominare la vecchia directory spinta indietro al suo nome originale

  • Pulire la soluzione
  • Sotto C/C++ -> Command Line-> Opzioni aggiuntive aggiungere "/ showIncludes"
  • Sotto Linker-> comando line-> Opzioni aggiuntive aggiungere "/ verbose: lib"
  • ricostruire tutti

Poi, quando costruisci, sarai in grado di vedere a quale punto sono incluse 1,42 intestazioni, ecc. Nella finestra di output. In qualche modo questo mi ha aiutato a rintracciare il problema.

0

On Come posso scoprire perché il linker vuole questo file?

ci sono programmi che passerà attraverso la vostra applicazione e DLL/librerie e rendere noto il contenuto di manifesta e quali sono i binari relazione da cui dipendono. È quindi possibile eseguire la scansione del report per includere le librerie impreviste. Lo abbiamo usato principalmente per trovare libs inclusa la versione precedente del runtime VC.

Non ho usato quello che avevamo tra circa 5 anni, ora, se solo potessi ricordare il nome dell'app!

DependancyWalker (depends.exe) consente di visualizzare dipendenze di librerie dll/exe ma non statiche.

È possibile aprire ciascun file binario come "file" in MSVS e osservare manualmente il contenuto del file manifest, ma immagino che ciò sarebbe un po 'doloroso. Non ho provato questo con una lib statica.

Problemi correlati