2009-03-02 10 views
11

Ho una soluzione con più progetti. Ho un progetto "principale", che funge da menu e da lì, l'utente può accedere a qualsiasi altro progetto. In questo progetto principale, ricevo errori di linker per ogni funzione chiamata. Come evito questi errori del linker? Ho impostato le dipendenze del progetto già nella finestra di dialogo "Dipendenze del progetto ...".Errori di linker tra più progetti in Visual C++

Grazie

Modifica - ho fatto come suggerito e ha aggiunto la cartella di output per ulteriori directory del linker. Ora, però, ho un milione di errori nel modo seguente:

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" ([email protected][email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" ([email protected][email protected]@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" ([email protected][email protected]@[email protected]@SAHXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " ([email protected][email protected][email protected]@[email protected]@@[email protected]@QBEDXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " ([email protected][email protected]@@QBEHXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " ([email protected][email protected]@@QBEHXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" ([email protected][email protected]@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " ([email protected][email protected]@@QBE_NXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" ([email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" ([email protected]@[email protected]) already defined in msvcprtd.lib(locale0_implib.obj) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" ([email protected]@[email protected]@@[email protected]@Z) already defined in msvcprtd.lib(locale0_implib.obj) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" ([email protected]@[email protected]@[email protected]@XZ) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" ([email protected]@[email protected]@[email protected]@XZ) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" ([email protected][email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" ([email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" ([email protected]@@[email protected]) already defined in msvcprtd.lib(MSVCP90D.dll) 

risposta

11

Senza conoscere ogni altro dettaglio riguardo la soluzione è difficile da dire, però Rigenera tutto, potrebbe essere utile. Questa situazione può talvolta verificarsi quando vi sono file di oggetti misti per diverse architetture.

si potrebbe anche voler considerare l'utilizzo "Riferimenti" al posto di "dipendenze"

EDIT:

Dopo quello che hai postato sembra che il collegamento con le librerie standard è incoerente. Potrebbe essere che uno dei progetti collega staticamente le librerie standard mentre altre lo fanno dinamicamente? (Vedi proprietà del progetto-> linker) O uno per il runtime di rilascio, mentre altri per il debug? (anche se l'ultimo dovrebbe essere possibile, con avvertenze)

+0

Penso che i riferimenti siano utilizzati solo per progetti .NET. Mentre l'OP non ha dichiarato questo in un modo o nell'altro, immagino che stia scrivendo in C++ non gestito. – Andy

+0

Uso riferimenti in C++ non gestito, funzionano perfettamente. – EFraim

+3

Grazie per aver menzionato il collegamento incoerente (/ MT contro/MD). Non ci avevo pensato e questo risultato ha risolto i miei errori LNK2005. –

0

Suppongo che gli errori del linker che si ottengono siano per "simboli non risolti"?

Se si utilizzano librerie statiche (ad esempio file .lib), è necessario aggiungere la libreria all'ingresso del linker, in modo che al momento del collegamento i simboli possano essere collegati. Se non lo fai, riceverai un simbolo non risolto:

  1. Fare clic con il tasto destro del mouse sul progetto e selezionare Proprietà.
  2. Selezionare Proprietà di configurazione-> Linker-> Input
  3. Immettere il nome della libreria (ad esempio filename.lib) in Dipendenze aggiuntive.
+1

Quando aggiungi una dipendenza del progetto in Visual Studio, si collega automaticamente all'output del progetto per te (non aggiunge il .lib alle Proprietà, però). – Andy

2

Le funzioni degli altri progetti vengono esportate? Se non vengono esportati, non c'è nulla da collegare al file exe principale, in modo da causare gli errori. Vedere Exporting from a DLL Using __declspec(export) per ulteriori informazioni.

20

È difficile rispondere senza conoscere tutti i dettagli della soluzione, ma assumerò che il tuo progetto "altro" sia impostato per produrre un file .lib, e il progetto principale collega quindi tutti questi file lib. In tal caso, una possibile causa degli errori che si verificano è che i progetti si collegano a versioni diverse della libreria di runtime.

Da Microsoft's documentation, "Tutti i moduli passati a una determinata chiamata del linker devono essere stati compilati con la stessa opzione del compilatore di libreria run-time (/ MD,/MT,/LD)."

Provare a modificare tutti i progetti per utilizzare la stessa versione della libreria di runtime. In Visual Studio 2010, questo è nelle proprietà del progetto | Proprietà di configurazione | C/C++ | Generazione del codice | Libreria di runtime. Scegliere DLL di debug multi-thread o Debug multi-thread (per la configurazione di debug).

+0

Grazie, Dani! Ho avuto questo problema e la tua soluzione era giusta. La mia libreria statica aveva la sua libreria di runtime impostata su "Debug multithread", mentre l'applicazione che lo collegava era impostata su "DLL di debug multithread". Modifica delle impostazioni della libreria di runtime in modo che tutto corrispondesse agli errori del linker. – vocaro

+0

Questo mi ha causato il fallimento. Grazie mille – rinormaloku

1

Gli errori che si verificano sono 'errore LNK2005' in cui un simbolo nella libreria che si sta collegando (msvcprtd.lib) è già stato definito in un'altra libreria (ad esempio panels.lib). Se aggiungi panels.lib al campo "ignora libreria specifica" (in Proprietà di configurazione VS2008 -> Linker -> Input -> Ignora librerie specifiche), gli errori si interromperanno.

0

Avevo un problema molto simile a questo, che si è verificato perché una delle mie librerie aveva l'opzione "Considera wchar_t come tipo incorporato" impostato su un valore diverso rispetto agli altri. Questa impostazione è falsa di default sui nuovi progetti. Cambiandoli tutti su true è stato risolto il problema.

0

Esattamente, almeno uno dei tuoi progetti è compilato con una "Libreria di runtime" diversa dalle altre. Forse ne hai aggiunto uno nuovo usando il default che è diverso. Controllare le proprietà del/i progetto/i per lo stesso valore di "Proprietà di configurazione" -> "C/C++" -> "Generazione codice" -> "Libreria runtime".

+0

Non è esattamente questo che ha detto Dani van der Meer tre anni prima? –

0

Nel mio caso, il problema era perché avevo mantenuto i prototipi di funzione, le definizioni di classe e l'implementazione della funzione e l'implementazione della classe in un singolo file cpp. Solo quando ho spostato le dichiarazioni e i prototipi in un file di intestazione separato, questi errori sono scomparsi. Molto strano!