5

Utilizzo Visual Studio da un po 'di tempo, sviluppando principalmente per C++. Spesso avevo bisogno di creare soluzioni, che contenessero più moduli (progetti) - ad esempio una libreria di utilità, che consisteva in un paio di file .dll.Quali sono le conseguenze dell'aggiunta di riferimenti al progetto C++ in Visual Studio?

Quando v'è la necessità di un modulo (A) per utilizzare un altro (B), v'è modello standard per questo:

  1. Include intestazione richiesto.
  2. Collega il file della libreria di output da B (ad esempio, in VS: Project Config ->Linker ->Input ->Additional Dependencies ->'B.lib').
  3. [Facoltativo] Imposta l'ordine di compilazione corretto (quindi B è costruito prima di A).

Recentemente ho iniziato a giocare con C#, perché ho deciso di sviluppare alcuni strumenti basati su GUI per il mio motore con esso (è molto più facile, rispetto all'utilizzo di C++ e le librerie esterne come Qt o wxWidgets). Ho imparato, che in C#, tali dipendenze vengono impostate utilizzando 'Riferimenti':

enter image description here

sono rimasto molto sorpreso, quando ho scoperto, che questa opzione è applicabile anche per i progetti C++!

In effetti, dopo aver creato una soluzione di esempio e impostato le dipendenze in questo modo, tutto funzionava correttamente, senza alcuna configurazione aggiuntiva come "Input del linker" o qualcosa del genere.

La mia domanda è: che cosa fa esattamente questa opzione fare per i progetti C++? Sono interessato a tutti i profitti e ai potenziali compromessi.

So già che causa il collegamento di output di altri progetti impostati come dipendenze. Qualunque altra cosa? Forse alcune dipendenze di runtime tra moduli di riferimento? In che modo influisce sull'output generato?

+0

Un riferimento di progetto prende automaticamente l'output dalla configurazione di build corrispondente dell'altro progetto (libreria Debug per la build di debug dell'applicazione, ecc.). Sarebbe un bel po 'di lavoro impostarlo manualmente. –

+0

Inoltre, dal momento che hai menzionato le DLL, sì il riferimento al progetto attiverà sia gli output di build, la libreria di importazione .lib e la DLL per il runtime. –

risposta

7

Era originariamente destinato a essere utilizzato solo in progetti C++/CLI. E ha fatto esattamente la stessa cosa che aggiungendo riferimenti a un progetto C#, si selezionano gli assembly di riferimento .NET necessari per compilare il progetto.

Ma questo ha confuso un gran numero di programmatori C++, hanno pensato che dovrebbe contenere qualcosa di generalmente utile. Probabilmente perché è sotto l'intestazione "Proprietà comuni". Molte domande a riguardo.

Avanti veloce a VS2010, una versione che era incompiuta. Uno dei pochi casi in cui un progetto Microsoft ha superato la data di spedizione prevista. Hanno avuto 6 settimane in più per risolvere l'elenco dei bug. Ma ciò non era sufficiente, la funzionalità che avrebbe dovuto facilitare il collegamento delle dipendenze era not actually implemented o disabilitata.

Così a VS2012 hanno deciso di farlo in un modo diverso e rendere Add Reference utile anche a un progetto C/C++ nativo. Scegli sempre un riferimento al progetto, deve essere una libreria statica o un progetto DLL. Uno che produce un file .lib. E dice automagicamente al linker di collegare quel file .lib. Nient'altro, semplicemente aggiunge il file .lib alla riga di comando del linker. Funziona bene.

Aggiornamento: modificato di nuovo per VS2015, ora ha un nodo Riferimenti.Fare clic con il tasto destro per aggiungere riferimenti a un altro progetto.

+1

Sembra molto più chiaro di quanto non si lavori con la modifica manuale di 'Linker input' o' #pragma comment'. –

+0

"... deve essere una libreria statica o un progetto DLL, uno che produce un file .lib." - ma solo una libreria statica genera il file .lib, mentre un progetto DLL non genera un file .lib, giusto? – athos

+1

Lo fa, la libreria di importazione. Deve essere collegato da qualsiasi progetto che utilizza la DLL in modo che il linker sappia che esiste un identificatore in un altro file eseguibile. –

Problemi correlati