web-dev-qa-db-fra.com

Comment spécifier un nouveau chemin GCC pour CMake

Mon système d'exploitation est centos qui a un gcc par défaut dans le chemin /usr/bin/gcc. Mais il est vieux, il me faut une nouvelle version de gcc. J'installe donc une nouvelle version dans un nouveau chemin /usr/local/bin/gcc.

Mais lorsque je lance cmake, il utilise toujours l'ancien chemin de la version gcc (/usr/bin/gcc). Comment puis-je spécifier le gcc au nouveau chemin (/usr/local/bin/gcc).

J'ai essayé d'écraser /usr/bin/gcc avec /usr/local/bin/gcc, mais cela ne fonctionne pas.

95
tidy

N'écrasez pas CMAKE_C_COMPILER, mais exportez CC (et CXX) avant d'appeler cmake:

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

L'exportation ne doit être effectuée qu'une fois, la première fois que vous configurez le projet, puis ces valeurs seront lues à partir du cache CMake.


UPDATE: plus d'explications sur pourquoi ne pas écraser CMAKE_C(XX)_COMPILER après le commentaire de Jake

Je recommande de ne pas écraser la valeur CMAKE_C(XX)_COMPILER pour deux raisons principales: parce que cela ne fonctionne pas bien avec le cache de CMake et parce qu'il interrompt les vérifications du compilateur et la détection des outils.

Lorsque vous utilisez la commande set, vous avez trois options:

  • sans cache, pour créer une variable normale
  • avec cache, pour créer une variable en cache
  • forcer le cache, pour toujours forcer la valeur du cache lors de la configuration

Voyons ce qui se passe pour les trois appels possibles à set:

sans cache

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

Ce faisant, vous créez une variable "normale" CMAKE_C(XX)_COMPILER qui masque la variable de cache du même nom. Cela signifie que votre compilateur est maintenant codé en dur dans votre script de construction et vous ne pouvez pas lui attribuer de valeur personnalisée. Ce sera un problème si vous avez plusieurs environnements de construction avec différents compilateurs. Vous pouvez simplement mettre à jour votre script chaque fois que vous souhaitez utiliser un compilateur différent, mais cela supprime la valeur d'utiliser CMake en premier lieu.

Ok, alors, mettons à jour le cache ...

avec cache

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

Cette version va juste "ne pas fonctionner". La variable CMAKE_C(XX)_COMPILER est déjà dans le cache, elle ne sera donc mise à jour que si vous la forcez.

Ah ... utilisons la force, alors ...

Cache forcé

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

C'est presque la même chose que la version de variable "normale", la seule différence est que votre valeur sera définie dans le cache, afin que les utilisateurs puissent la voir. Mais tout changement sera écrasé par la commande set.

Casser les vérifications du compilateur et l'outillage

Au début du processus de configuration, CMake effectue des contrôles sur le compilateur: ça fonctionne? Est-il capable de produire des exécutables? etc. Il utilise également le compilateur pour détecter les outils associés, tels que ar et ranlib. Lorsque vous écrasez la valeur du compilateur dans un script, il est "trop ​​tard", toutes les vérifications et les détections sont déjà effectuées.

Par exemple, sur ma machine avec gcc comme compilateur par défaut, lors de l'utilisation de la commande set pour /usr/bin/clang, ar est défini sur /usr/bin/gcc-ar-7. Lorsque vous utilisez une exportation avant d'exécuter CMake, celle-ci est définie sur /usr/lib/llvm-3.8/bin/llvm-ar.

180
Guillaume

Cette question est assez ancienne mais reste sur Google Search. La question acceptée ne fonctionnait plus pour moi et semble être âgée. Les dernières informations sur cmake sont écrites dans le FAQ de cmake .

Il existe différentes manières de changer le chemin de votre compilateur. Une façon serait

Définissez la ou les variables CMAKE_FOO_COMPILER appropriées sur un nom de compilateur valide ou un chemin complet sur la ligne de commande à l'aide de cmake -D. Par exemple:

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

au lieu de gcc-4.2, vous pouvez écrire le path/to/your/compiler comme ceci

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

Définissez CMAKE_C_COMPILER sur votre nouveau chemin.

Voir ici: http://www.cmake.org/Wiki/CMake_Useful_Variables

6
John Zwinck

L'exportation doit spécifier la version de GCC/G ++ à utiliser, car si l'utilisateur dispose de plusieurs versions du compilateur, la compilation sera impossible.

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

Dans le cas où le projet utilise C++ 11, ceci peut être géré à l'aide de l'indicateur -std=C++-11 dans CMakeList.txt.

3
R.Chatsiri

Une autre solution consiste à configurer votre projet via cmake-gui, à partir d'un répertoire de construction propre. Parmi les options disponibles au début, il y a la possibilité de choisir le chemin exact vers les compilateurs

2
Antonio