Collegamento
In un progetto C++ il passaggio di collegamento viene eseguito dopo che il compilatore compila il codice sorgente in file oggetto (*.obj). Il linker (link.exe
) combina i file oggetto in un singolo file eseguibile.
Le opzioni del linker possono essere impostate all'interno o all'esterno di Visual Studio. In Visual Studio è possibile accedere alle opzioni del linker facendo clic con il pulsante destro del mouse su un nodo del progetto in Esplora soluzioni e scegliendo Proprietà per visualizzare le pagine delle proprietà. Scegliere Linker nel riquadro sinistro per espandere il nodo e visualizzare tutte le opzioni.
Sintassi della riga di comando del linker
Quando si esegue il linker all'esterno di Visual Studio, è possibile specificare l'input in uno o più modi:
- Sulla riga di comando
- Uso dei file di comando
- Nelle variabili di ambiente
Il linker elabora innanzitutto le opzioni specificate nella LINK
variabile di ambiente, seguite dalle opzioni nell'ordine in cui sono specificate nella riga di comando e nei file di comando. Se un'opzione viene ripetuta con argomenti diversi, l'ultima elaborata ha la precedenza.
Le opzioni si applicano all'intera compilazione; nessuna opzione può essere applicata a file di input specifici.
Per eseguire link.exe
, usare la sintassi di comando seguente:
link arguments
Le arguments
opzioni di inclusione e i nomi file e possono essere specificati in qualsiasi ordine. Le opzioni vengono elaborate per prime, quindi i file. Usare uno o più spazi o schede per separare gli argomenti.
Nota
È possibile avviare questo strumento solo dal prompt dei comandi di Visual Studio. Non è possibile avviarlo da un prompt dei comandi di sistema o da Esplora file.
Riga di comando
Nella riga di comando un'opzione è costituita da un identificatore di opzione, un trattino (-
) o una barra (/
), seguito dal nome dell'opzione. I nomi delle opzioni non possono essere abbreviati. Alcune opzioni accettano un argomento, specificato dopo i due punti (:
). Non sono consentiti spazi o tabulazioni all'interno di una specifica di opzione, ad eccezione di una stringa tra virgolette nell'opzione /COMMENT
. Specificare argomenti numerici nella notazione decimale o in linguaggio C. I nomi delle opzioni e le relative parole chiave o argomenti nomefile non fanno distinzione tra maiuscole e minuscole, ma gli identificatori come argomenti fanno distinzione tra maiuscole e minuscole.
Per passare un file al linker, specificare il nome file nella riga di comando dopo il link.exe
comando. È possibile specificare un percorso assoluto o relativo con il nome file ed è possibile usare caratteri jolly nel nome file. Se si omette il punto (.
) e l'estensione del nome file, il linker presuppone un'estensione di .obj
per trovare il file. Il linker non usa le estensioni del nome file o la mancanza di tali estensioni per fare ipotesi sul contenuto dei file. Determina il tipo di file esaminandolo ed elaborandolo di conseguenza.
Il linker restituisce zero per l'esito positivo (nessun errore). In caso contrario, restituisce il numero di errore che ha arrestato il collegamento. Ad esempio, se il linker genera LNK1104
, il linker restituisce 1104. Di conseguenza, il numero di errore più basso restituito in un errore dal linker è 1000. Un valore restituito 128 rappresenta un problema di configurazione con il sistema operativo o un file con estensione config; il caricatore non è stato link.exe
caricato o c2.dll
.
File di comando del linker
È possibile passare argomenti della riga di comando a link.exe
sotto forma di file di comando. Per specificare un file di comando per il linker, usare la sintassi seguente:
link @commandfile
commandfile
è il nome di un file di testo. Non è consentito spazio o tabulazioni tra il segno di chiome (@) e il nome file. Non esiste un'estensione predefinita; è necessario specificare il nome file completo, inclusa qualsiasi estensione. Non è possibile usare caratteri jolly. È possibile specificare un percorso assoluto o relativo con il nome file. Il linker non usa una variabile di ambiente per cercare il file.
Nel file di comando gli argomenti sono separati da spazi o tabulazioni (come nella riga di comando) e da caratteri di nuova riga.
È possibile specificare tutto o parte della riga di comando in un file di comando. È possibile usare più file di comando in un link.exe
comando. Il linker accetta l'input del file di comando come se fosse stato specificato in tale posizione nella riga di comando. I file di comando non possono essere annidati. Il linker restituisce il contenuto dei file di comando, a meno che non /NOLOGO
venga specificato.
Esempio
Il comando seguente compila una DLL. Passa i nomi dei file oggetto e delle librerie in file di comando separati e usa un terzo file di comando per specificare l'opzione /EXPORTS
:
link /dll @objlist.txt @liblist.txt @exports.txt
VARIABILI di ambiente LINK
Il linker riconosce le variabili di ambiente seguenti:
LINK
e_LINK_
, se definito. Il linker antepone le opzioni e gli argomenti definiti nellaLINK
variabile di ambiente e aggiunge le opzioni e gli argomenti definiti nella variabile di ambiente agli argomenti della_LINK_
riga di comando prima dell'elaborazione.LIB
, se definito. Il linker usa ilLIB
percorso quando cerca un oggetto, una libreria o un altro file specificato nella riga di comando o dall'opzione/BASE
. Usa anche ilLIB
percorso per trovare un.pdb
file denominato in un oggetto . LaLIB
variabile può contenere una o più specifiche di percorso, separate da punti e virgola. Un percorso deve puntare alla\lib
sottodirectory dell'installazione di Visual C++.PATH
, se lo strumento deve essere eseguitoCVTRES
e non riesce a trovare il file nella stessa directory dilink.exe
se stessa. (link.exe
richiedeCVTRES
di collegare un.res
file.PATH
) deve puntare alla\bin
sottodirectory dell'installazione di Visual C++.TMP
, per specificare una directory durante il collegamento di file o.res
OMF.
Vedi anche
C/C++ Building Reference (Informazioni di riferimento per la compilazione in C/C++)
Opzioni del linker MSVC
File module-definition (con estensione def)
Supporto per le DLL a caricamento ritardato nel linker