Domanda

Ho una soluzione con più progetti. Ho un " principale " progetto, che funge da menu e da lì l'utente può accedere a qualsiasi altro progetto. Su questo progetto principale, ottengo errori del linker per ogni funzione chiamata. Come evitare questi errori del linker? Ho impostato le dipendenze del progetto già nelle "Dipendenze del progetto ..." finestra di dialogo.

Grazie

MODIFICA - Ho fatto come suggerito e ho aggiunto la cartella di output alle directory aggiuntive del linker. Ora, tuttavia, ricevo un milione di errori come segue:

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) 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)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) 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 &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) 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 " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@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 " (?flags@ios_base@std@@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 " (?width@ios_base@std@@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 *)" (?length@?$char_traits@D@std@@SAIPBD@Z) 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)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) 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 " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@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)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@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)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) 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 *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@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 *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) 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 *)" (?facet_Register@facet@locale@std@@CAXPAV123@@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)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@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)" (?_Init@locale@std@@CAPAV_Locimp@12@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 &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@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 *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
È stato utile?

Soluzione

Senza conoscere altri dettagli sulla tua soluzione, è difficile dirlo, tuttavia Ricostruisci tutto, potrebbe essere utile. Questa situazione può talvolta verificarsi quando sono presenti file di oggetti misti per architetture diverse.

Potresti anche prendere in considerazione l'utilizzo di " Riferimenti " invece di " Dipendenze "

Modifica

Dopo quello che hai pubblicato sembra che il tuo collegamento con le librerie standard sia incoerente. Potrebbe essere che uno dei progetti colleghi staticamente le librerie standard mentre altri dinamicamente? (Vedi le proprietà del progetto - > linker) O uno al runtime di rilascio, mentre altri al debug? (anche se l'ultimo dovrebbe essere possibile, con avvertimenti)

Altri suggerimenti

È difficile rispondere senza conoscere tutti i dettagli sulla tua soluzione, ma assumerò il tuo " altro " il progetto è 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 Documentazione di Microsoft , " Tutti i moduli passati a una determinata chiamata del linker devono essere stati compilati con la stessa opzione di compilatore della libreria di runtime (/ MD, / MT, /LD)."

Prova a cambiare 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 di codice | Libreria di runtime. Scegli DLL di debug multi-thread o Debug multi-thread (per la tua configurazione di debug).

Le funzioni degli altri progetti vengono esportate? Se non vengono esportati, non c'è nulla a cui collegarsi dall'exe principale, quindi ciò causerebbe gli errori. Vedi Esportazione da una DLL mediante __declspec (export) per ulteriori informazioni.

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

Presumo che gli errori del linker che stai riscontrando siano per "simboli non risolti"?

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

  1. Fai clic con il pulsante destro del mouse sul progetto e seleziona Proprietà.
  2. Seleziona Proprietà di configurazione- > Linker- > Input
  3. Immettere il nome della libreria (ad esempio nomefile.lib) in Dipendenze aggiuntive.

Ho avuto un problema molto simile a questo che si è rivelato perché una delle mie librerie aveva l'opzione 'Tratta wchar_t come tipo incorporato' impostata su un valore diverso dagli altri. Questa impostazione è falsa per impostazione predefinita nei nuovi progetti. La modifica di tutti in true ha risolto il problema.

Esatto, almeno uno dei tuoi progetti è compilato con una diversa "Libreria di runtime" poi gli altri. Forse ne hai aggiunto uno nuovo usando quello predefinito che è diverso. Controlla le proprietà dei tuoi progetti per lo stesso valore di " Proprietà di configurazione " - > & Quot; C / C ++ " - > " Generazione di codice " - > " Libreria di runtime " ;.

Nel mio caso, il problema era perché avevo conservato 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. Davvero strano!

Nel mio caso, ho due metodi:

  1. Proprietà progetto - > C / C ++ - > Generazione di codice - > Libreria di runtime. modificala in MT.

  2. Aggiungi la tua libreria mancanza a: Linker- > Input - > Dipendenze aggiuntive. Se non funziona, prova ad aggiungere un percorso completo anziché un nome di libreria.

Ad esempio: C: \ Programmi (x86) \ Microsoft Visual Studio 14.0 \ VC \ lib \ amd64 \ libvcruntime.lib;

Funziona per me. Rispondi a questa domanda per chiunque abbia bisogno di aiuto.

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