Come specificare un nuovo percorso GCC per CMake


122

Il mio sistema operativo è centos che ha un gcc predefinito nel percorso /usr/bin/gcc. Ma è vecchio, ho bisogno di una nuova versione di gcc. Quindi installo una nuova versione in un nuovo percorso /usr/local/bin/gcc.

Ma quando eseguo cmake, utilizza ancora la vecchia versione gcc path ( /usr/bin/gcc). Come posso specificare il gcc in new path ( /usr/local/bin/gcc).

Ho provato a sovrascrivere /usr/bin/gcccon /usr/local/bin/gcc, ma non funziona.


2
Penso che sia una buona pratica installare una versione alternativa di gcc /optpiuttosto che in /usr/local. Preferibilmente /opt/gcc-x.y.z. In questo modo, se hai bisogno di una versione ancora più recente, non avrai problemi a disinstallare quella precedente.
user666412

Risposte:


220

Non sovrascrivere CMAKE_C_COMPILER, ma esportare CC(e CXX) prima di chiamare cmake:

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make

L'esportazione deve essere eseguita solo una volta, la prima volta che si configura il progetto, quindi quei valori verranno letti dalla cache di CMake.


AGGIORNAMENTO : spiegazione più lunga sul perché non sovrascrivere CMAKE_C(XX)_COMPILERdopo il commento di Jake

Raccomando di non sovrascrivere il CMAKE_C(XX)_COMPILERvalore per due motivi principali: perché non funziona bene con la cache di CMake e perché interrompe i controlli del compilatore e il rilevamento degli strumenti.

Quando si utilizza il setcomando, sono disponibili tre opzioni:

  • senza cache, per creare una variabile normale
  • con cache, per creare una variabile memorizzata nella cache
  • forza cache, per forzare sempre il valore della cache durante la configurazione

Vediamo cosa succede per le tre possibili chiamate a set:

Senza cache

set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)

Quando si esegue questa operazione, si crea una variabile "normale" CMAKE_C(XX)_COMPILERche nasconde la variabile cache con lo stesso nome. Ciò significa che il tuo compilatore è ora hardcoded nello script di build e non puoi assegnargli un valore personalizzato. Questo sarà un problema se hai più ambienti di compilazione con compilatori diversi. Potresti semplicemente aggiornare lo script ogni volta che desideri utilizzare un compilatore diverso, ma ciò rimuove il valore dell'utilizzo di CMake in primo luogo.

Ok, allora, aggiorniamo la cache ...

Con cache

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "")
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "")

Questa versione semplicemente "non funzionerà". La CMAKE_C(XX)_COMPILERvariabile è già nella cache, quindi non verrà aggiornata a meno che non venga forzata.

Ah ... usiamo la forza, allora ...

Forza cache

set(CMAKE_C_COMPILER /usr/bin/clang CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/clang++ CACHE PATH "" FORCE)

Questa è quasi la stessa della versione variabile "normale", l'unica differenza è che il tuo valore verrà impostato nella cache, in modo che gli utenti possano vederlo. Ma qualsiasi modifica verrà sovrascritta dal setcomando.

Rompere i controlli e gli strumenti del compilatore

All'inizio del processo di configurazione, CMake esegue controlli sul compilatore: funziona? È in grado di produrre eseguibili? ecc. Utilizza anche il compilatore per rilevare strumenti correlati, come are ranlib. Quando si sovrascrive il valore del compilatore in uno script, è "troppo tardi", tutti i controlli e i rilevamenti sono già stati eseguiti.

Ad esempio, sulla mia macchina con gcc come compilatore predefinito, quando si utilizza il setcomando su /usr/bin/clang, arè impostato su /usr/bin/gcc-ar-7. Quando si utilizza un'esportazione prima di eseguire CMake, è impostata su /usr/lib/llvm-3.8/bin/llvm-ar.


Equivalente per i pigri, se i compilatori corretti sono impostati nel tuo $ PATH:> export CC = which gcc > export CXX =which g++
gerardw

11
Equivalente per i pigri, se i compilatori corretti sono impostati nel tuo $ PATH: export CC=`which gcc` export CXX=`which g++`
gerardw

Se CC / CXX differisce dal percorso, ottengoIncorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
Lilith River

1
Come posso farlo se sono su Windows?
mr5

5
In realtà, l'impostazione CMAKE_C_COMPILERfunziona bene purché lo si fa utilizzando la riga di comando: $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source.
Erwan Legrand

25

Questa domanda è piuttosto vecchia ma viene ancora visualizzata su Ricerca Google. La domanda accettata non funzionava più per me e sembra essere invecchiata. Le ultime informazioni su cmake sono scritte nelle FAQ di cmake .

Esistono vari modi per modificare il percorso del compilatore. Un modo sarebbe

Impostare le CMAKE_FOO_COMPILERvariabili appropriate su un nome di compilatore valido o su un percorso completo sulla riga di comando utilizzando cmake -D. Per esempio:

cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source

invece di gcc-4.2puoi scrivere path/to/your/compilercosì

 cmake -D CMAKE_C_COMPILER=/path/to/gcc/bin/gcc -D CMAKE_CXX_COMPILER=/path/to/gcc/bin/g++ .

2
Lo stavo facendo durante la creazione di un vecchio progetto su un vecchio compilatore (GCC 5.3) mentre un compilatore più recente (GCC 7.3) veniva fornito nell'ambiente. Ha costruito bene e ha funzionato sulla mia macchina, ma una volta spostato l'eseguibile su una macchina diversa mi sono reso conto che il programma è collegato a libstdc ++. Quindi dal 7.3 di origine invece del 5.3 richiesto ...
Adam Badura


3

L'esportazione dovrebbe essere specifica sulla versione di GCC / G ++ da utilizzare, perché se l'utente avesse più versioni del compilatore, non si compilerebbe correttamente.

 export CC=path_of_gcc/gcc-version
 export CXX=path_of_g++/g++-version
 cmake  path_of_project_contain_CMakeList.txt
 make 

Nel caso in cui il progetto utilizzi C ++ 11, questo può essere gestito utilizzando il -std=C++-11flag in CMakeList.txt


2

Una soluzione alternativa è configurare il progetto tramite cmake-gui, partendo da una directory di compilazione pulita. Tra le opzioni che hai a disposizione all'inizio c'è la possibilità di scegliere il percorso esatto dei compilatori


2

Funziona non solo con cmake, ma anche con ./configuree make:

./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++

Che si traduce in:

checking for gcc... /usr/local/bin/gcc
checking whether the C compiler works... yes

0

Cambia CMAKE_<LANG>_COMPILERpercorso senza attivare una riconfigurazione

Volevo compilare con un compilatore alternativo, ma anche passare le opzioni -D sulla riga di comando che sarebbero state cancellate impostando un compilatore diverso. Ciò accade perché attiva una riconfigurazione. Il trucco è disabilitare il rilevamento del compilatore con NONE, impostare i percorsi con FORCE, quindi enable_language.

project( sample_project NONE )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" FORCE )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" FORCE )

enable_language( C CXX )

Usa un file Toolchain

La scelta più sensata è creare un file toolchain.

set( CMAKE_SYSTEM_NAME Darwin )

set( COMPILER_BIN /opt/compiler/bin )
set( CMAKE_C_COMPILER ${COMPILER_BIN}/clang CACHE PATH "clang" )
set( CMAKE_CXX_COMPILER ${COMPILER_BIN}/clang++ CACHE PATH "clang++" )

Quindi invoca Cmake con un flag aggiuntivo

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.