13

Recentemente ho aggiornato al 2012 dal 2005 (ne sono abbastanza sicuro) e ho riscontrato errori di collegamento durante la creazione della mia soluzione. Ho perso idee dopo ore di ricerche su google e in giro. Ho creato dozzine di progetti, quindi sono abbastanza certo di aver fatto tutto bene, ma per essere onesti, sono passati alcuni anni.Errori di collegamento di Visual Studio 2012 con librerie statiche

Quindi, come test ho creato un nuovo progetto. L'ho chiamato App, un'applicazione Windows (.exe). Ho creato un secondo progetto chiamato Core e contrassegnato come libreria statica (.lib) nel suo tipo di configurazione. Entrambi fanno parte della soluzione. In Core ho aggiunto Test.cpp e Test.h che contengono una piccola classe che ha una funzione semplice in essa. Quindi, all'interno del file WinMain.cpp delle applicazioni di Windows ho WinMain() dove chiamo in questa classe di test tramite CTest test; Risultato del test();

Insieme a questo ho impostato le dipendenze del progetto dell'app per essere core e infine aggiunto alle directory di inclusione aggiuntive dell'app il percorso del codice core in cui Test.cpp/.h live.

Ottengo i seguenti errori di collegamento e non riesco, per la vita di me, a capire perché. Qualcuno sa quale passo ho perso o cosa è cambiato nel 2012 rispetto alle versioni precedenti? Grazie mille in anticipo per l'aiuto!

1>------ Build started: Project: App, Configuration: Debug Win32 ------ 
1>WinMain.obj : error LNK2019: unresolved external symbol "public: __thiscall CTest::CTest(void)" ([email protected]@[email protected]) referenced in function [email protected] 
1>WinMain.obj : error LNK2019: unresolved external symbol "public: __thiscall CTest::~CTest(void)" ([email protected]@[email protected]) referenced in function [email protected] 
1>WinMain.obj : error LNK2019: unresolved external symbol "public: int __thiscall CTest::Result(void)" ([email protected]@@QAEHXZ) referenced in function [email protected] 
1>D:\Work\Test_Linker_Stupidity\App\Debug\App.exe : fatal error LNK1120: 3 unresolved externals 
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ======== 

risposta

27

Visual Studio 2005 ha fatto qualche magia con dipendenze di progetto dove sarebbe collegare automaticamente in qualsiasi uscita lib (io purtroppo era lo sviluppatore che ha contribuito a realizzarlo). Sembra che sia stato rimosso da quando, sospetto, Visual Studio 2010 quando il vecchio sistema di compilazione di Visual C++ è stato sostituito con MSBuild.

Tuttavia, il "collegamento automatico di dipendenze di librerie statiche" caratteristica può ancora essere trovati tramite riferimenti al progetto:

  • Fare clic destro sul progetto App e selezionare "Riferimenti ..."
  • Fare clic su "Aggiungi Nuovo riferimento ".
  • Controllare il progetto della libreria statica e premere OK.
  • Build.

Ora dovresti vedere la libreria statica collegata automaticamente. Nota che i riferimenti di progetto implicano anche una dipendenza del progetto.

Se si preferisce utilizzare una dipendenza di progetto, è necessario aggiungere la libreria statica alla proprietà di dipendenze aggiuntive del linker sul progetto "App", come per qualsiasi altro input di libreria statica.

Modifica: inoltre, sul riferimento del progetto verrà visualizzata una proprietà denominata "Dipendenze libreria di collegamenti". Questo controlla se l'output .lib del progetto di riferimento viene collegato o meno (valore predefinito true).

+1

Grazie Peter! Ieri sera ho telefonato ad alcuni amici su FB e loro mi hanno indicato nella stessa direzione. È stato sorprendente che non abbia trovato altri articoli che facessero riferimento alla stessa soluzione, quindi spero che questo sarà vantaggioso per gli altri in futuro. Avevo anche provato ad aggiungere le libs come input, che funzionava sicuramente, ma era molto meno che ideale. In realtà avevo dimenticato di aver provato quella soluzione, albiet brevemente. Grazie ancora per l'aiuto! –

+0

Come riferimento rapido, questo è il collegamento a cui sono stato indirizzato: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/d69aeb0d-e5fb-41e1-98ad-9b6c7b43a3ca/# c8b80c9a-2e8d-4a06-9d0f-a63ee15a208e –

+0

Molto utile, grazie Peter. – Ken