Condividi tramite


Risolvere gli errori di compilazione nelle porte vcpkg

Questa guida è destinata agli utenti che riscontrano problemi durante l'installazione delle porte tramite vcpkg.

Individuare i log degli errori

Gli errori di compilazione possono verificarsi per un numero quasi infinito di motivi. Quando vcpkg non riesce a compilare una porta, il primo passaggio per diagnosticare il motivo consiste nel leggere i file di log.

vcpkg genera un file di log per ogni processo esterno che viene richiamato durante la compilazione di una porta. Quando si verifica un errore, vcpkg stampa il percorso del file di log per l'ultimo processo eseguito prima dell'errore ocurred. Cercare la riga "Vedere i log per altre informazioni:" nell'output vcpkg.

Esempio: output del percorso dei file di log

    See logs for more information:
      C:\Users\viromer\work\vcpkg\buildtrees\detect_compiler\config-x64-linux-rel-CMakeCache.txt.log
      C:\Users\viromer\work\vcpkg\buildtrees\detect_compiler\config-x64-linux-out.log

È possibile trovare tutti i file di log prodotti esaminando la directory della buildtrees porta che si trova in $VCPKG_ROOT/buildtrees/<port>/ (sostituire <port> con il nome della porta appropriato).

Impossibile scaricare gli asset della porta

Nota

L'uso della memorizzazione nella cache degli asset consente di attenuare questo tipo di problemi garantendo la disponibilità continua degli asset memorizzati nella cache.

Quando si installa una porta si verifica un errore durante il download di un asset dalla rete.

CMake Error at scripts/cmake/vcpkg_download_distfile.cmake:32 (message):

  Failed to download file with error: 1

Causa 1: L'URL di download non è più valido

Per motivi esterni agli URL di controllo di vcpkg può diventare non valido. I collegamenti interrotti possono essere diagnosticati usando un Web browser per passare all'URL di download, un collegamento interrotto genererà un codice di stato 404.

Procedura di risoluzione:

1 - Modificare la porta per usare un URL di download alternativo per l'asset.

Causa 2: l'hash del file non corrisponde al previsto SHA512

error: Failed to download from mirror set
error: File does not have the expected hash:
url: https://github.com/OpenImageIO/oiio/archive/v2.4.13.0.tar.gz
File: /home/user/vcpkg/downloads/OpenImageIO-oiio-v2-9325beef.4.13.0.tar.gz.1925416.part
Expected hash: 9325beefce55b66a58fcfc2ce93e1406558ed5f6cc37cb1e8e04aee470c4f30a14483bebfb311c329f7868afb6c508a052661c6b12d819a69f707c1a30cd9549
Actual hash: 9e887c7039995ce7c41556e09a7eed940863260a522ecf7d9bec300189026ed507da560620dfa4a619deeb679be7adf42fe3a7020ff3094df777c7934c771227

Questo errore si verifica quando il file upstream è stato modificato in qualsiasi modo dal server, ma l'URL di download viene mantenuto lo stesso. Come misura di sicurezza, vcpkg rifiuterà i file con SHA512 che non corrispondono al previsto SHA512 per l'asset.

Procedura di risoluzione:

1 - Verificare che il file scaricato sia sicuro 2 - Modificare la porta per usare il nuovo file SHA512

Impossibile trovare la toolchain di Visual Studio

Quando si installa una porta vcpkg non è in grado di individuare una toolchain appropriata:

error: in triplet arm-windows: Unable to find a valid toolchain for requested target architecture arm.
The selected Visual Studio instance is at: C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools
The available toolchain combinations are: x86, amd64, x86_amd64, amd64_x86

Causa 1: la toolchain appropriata per l'architettura di destinazione non è installata

Se l'istanza di Visual Studio corrisponde alla versione vcpkg desiderata e viene visualizzato questo errore, la causa più probabile è che la toolchain appropriata non sia installata.

  • Aprire il Programma di installazione di Visual Studio e installare la toolchain appropriata.

Causa 2: La versione selezionata di Visual Studio non è corretta

Se la toolchain richiesta è installata, vcpkg potrebbe aver selezionato una versione non corretta di Visual Studio in cui la toolchain non è installata. Per altre informazioni, vedere la documentazione relativa all'algoritmo di selezione di Visual Studio.

Procedura di risoluzione:

1 - Impostare sulla VCPKG_PLATFORM_TOOLSET versione appropriata. 2 - In alternativa, impostare il VCPKG_VISUAL_STUDIO_PATH sul percorso di installazione dell'istanza di Visual Studio desiderato.

Dipendenze di sistema mancanti

Nell'ambiente non è installato uno strumento di compilazione o una dipendenza di sistema necessaria.

Esempio: La porta richiede dipendenze di sistema

alsa currently requires the following programs from the system package manager:
    autoconf autoheader aclocal automake libtoolize
On Debian and Ubuntu derivatives:
    sudo apt install autoconf libtool
On recent Red Hat and Fedora derivatives:
    sudo dnf install autoconf libtool
On Arch Linux and derivatives:
    sudo pacman -S autoconf automake libtool
On Alpine:
    apk add autoconf automake libtool

La maggior parte delle porte vcpkg che richiedono dipendenze di sistema stampano un messaggio durante l'installazione. In alcuni casi, l'elenco delle dipendenze di sistema necessarie potrebbe essere incompleto. La diagnosi di questo tipo di problemi dipende dal sistema compilato sottostante, controllare i log degli errori per determinare la causa dell'errore.

Procedura di risoluzione:

1 - Seguire i passaggi appropriati per installare la dipendenza di sistema mancante nell'ambiente.

La dipendenza FetchContent non viene trovata durante il processo di compilazione

Una compilazione ha esito negativo perché una dipendenza è stata soddisfatta tramite FetchContent non è disponibile durante il processo di compilazione.

include(FetchContent)

FetchContent_Declare(fmt
  GIT_REPOSITORY https://github.com/fmtlib/fmt.git
  GIT_TAG master
)
FetchContent_MakeAvailable(fmt)
CMake Error at CMakeLists.txt:23 (target_link_libraries):
  Target "my_sample_lib" links to:

    fmt::fmt

  but the target was not found.  Possible reasons include:

    * There is a typo in the target name.
    * A find_package call is missing for an IMPORTED target.
    * An ALIAS target is missing.

vcpkg disabilita FetchContent tramite la variabile FETCHCONTENT_FULLY_DISCONNECTEDCMake . Ci sono più motivazioni per disabilitare questa funzionalità, per denominare alcuni:

  • FetchContent può nascondere le dipendenze fornitore sulle porte.
  • FetchContent non interagisce bene con scenari completamente disconnessi.
  • Le dipendenze acquisite tramite FetchContent possono modificare la compilazione senza partecipare al calcolo hash ABI.

Per i gestori delle porte, è consigliabile che qualsiasi pacchetto acquisito tramite FetchContent venga trasformato in una dipendenza vcpkg. Tuttavia, per l'uso generale sono disponibili soluzioni alternative per abilitare FetchContent.

Procedura di risoluzione:

1 - Usare VCPKG_CMAKE_CONFIGURE_OPTIONS da impostare FETCHCONTENT_FULLY_DISCONNECTED=FALSE

Le dipendenze installate da vcpkg non sono collegate durante la compilazione del progetto

Quando si compila il progetto tramite la modalità manifesto o la modalità classica, le dipendenze vcpkg non vengono caricate e collegate al progetto, causando errori di compilazione.

vcpkg offre il collegamento automatico delle librerie e include le directory per i progetti CMake e MSBuild . Le dipendenze installate tramite vcpkg devono essere disponibili automaticamente per l'utilizzo nel progetto.

Causa 1: Le dipendenze necessarie non sono installate

Procedura di risoluzione:

1 - Assicurarsi che le dipendenze del progetto siano pronte:

Se si usa un file manifesto (vcpkg.json), assicurarsi che il file si trovi nella stessa directory contenente il CMakeList.txt file. Assicurarsi inoltre che tutte le dipendenze siano elencate nel "dependencies" campo nel manifesto. vcpkg installerà automaticamente le dipendenze nel manifesto quando si compila il progetto.

Se si usa l'interfaccia della riga di comando di vcpkg per installare i pacchetti in modalità classica, assicurarsi che tutte le dipendenze necessarie siano preinstallate prima di eseguire la compilazione del progetto. vcpkg non installa automaticamente i pacchetti richiesti dal progetto quando viene usato in modalità classica.

Causa 2: L'integrazione per il sistema di compilazione non è abilitata

CMake

Procedura di risoluzione:

1 - Impostare la CMAKE_TOOLCHAIN_FILE variabile sulla toolchain vcpkg.

Deve CMAKE_TOOLCHAIN_FILE essere impostato in modo che punti al file toolchain Vcpkg CMake che si trova in {VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake, assicurarsi di sostituire {VCPKG_ROOT} con il percorso corretto per la directory di installazione vcpkg.

È possibile usare uno dei metodi seguenti per impostare il file toolchain:

  • Uso di un CMakePresets.json file:
    • Impostare toolchainFile se si usa la versione 3 o successiva.
    • Impostare CMAKE_TOOLCHAIN_FILE come cacheVariable se si usa la versione 2 o precedente.
  • Passare l'oggetto -DCMAKE_TOOLCHAIN_FILE={VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake argomento della riga di comando durante la chiamata a CMake.
  • Impostare CMAKE_TOOLCHAIN_FILE nel CMakeList.txt file. Assicurarsi che questa variabile sia impostata prima di qualsiasi chiamata a project().

Se si usa già un file toolchain personalizzato tramite CMAKE_TOOLCHAIN_FILE, impostare VCPKG_CHAINLOAD_TOOLCHAIN_FILE tramite un triplo personalizzato per puntare alla toolchain personalizzata.

MSBuild

vcpkg fornisce un meccanismo di integrazione globale tramite il vcpkg integrate install comando .

Quando il comando viene eseguito una sola volta, l'integrazione di vcpkg diventa abilitata per tutti i progetti che usano MSBuild, con la modalità manifesto o la modalità classica.

Questa integrazione è specifica per l'istanza vcpkg da cui è stato eseguito il comando, quindi se sono presenti più istanze vcpkg, solo la versione dello strumento e i pacchetti installati in tale istanza specifica sono disponibili nei progetti.

Leggere la documentazione sull'integrazione di MSBuild per informazioni su come abilitare l'integrazione di vcpkg per un singolo progetto o soluzione.

Procedura di risoluzione:

1 - Eseguire vcpkg integrate install per l'istanza vcpkg da usare

Eseguire vcpkg integrate install per abilitare l'integrazione globale con MSBuild. Questa operazione deve essere eseguita una sola volta per abilitare l'istanza vcpkg per tutti i progetti.

Impossibile installare i pacchetti usando la modalità classica

L'uso del vcpkg install comando ha esito negativo con il messaggio seguente:

error: Could not locate a manifest (vcpkg.json) above the current working directory.
This vcpkg distribution does not have a classic mode instance.

Causa 1: Uso della copia incorporata di Visual Studio di vcpkg

Visual Studio 2022 include una copia di vcpkg installabile con il flusso di lavoro C++. Questo vcpkg in bundle viene installato in un percorso di sola lettura e, di conseguenza, non può essere usato in modalità classica.

Si usa un terminale incorporato di Visual Studio o un'istanza di Visual Studio Developer PowerShell con una copia del vcpkg in bundle nel relativo PERCORSO.

Procedura di risoluzione:

1 - Creare un file manifesto (vcpkg.json) per installare le dipendenze del progetto. 2 - Se si dispone di un'istanza autonoma di vcpkg, è possibile usarla impostando la VCPKG_ROOT variabile e aggiungendo il percorso di installazione alla PATH variabile.

$env:VCPKG_ROOT="path/to/standalone/vcpkg"
$env:PATH="$env:PATH;$env:VCPKG_ROOT"

Il problema non è riportato nell'elenco

Se il problema non è elencato qui, visitare il repository per creare un nuovo problema.