Як вказати новий шлях GCC для CMake


122

Моя ОС - центос, який має за замовчуванням gcc у шляху /usr/bin/gcc. Але це стара, мені потрібна нова версія gcc. Тому я встановлюю нову версію по новому контуру/usr/local/bin/gcc .

Але коли я запускаю cmake, він все ще використовує стару версію gcc path ( /usr/bin/gcc). Як я можу вказати gcc до нового шляху ( /usr/local/bin/gcc).

Я спробував переписати /usr/bin/gccз /usr/local/bin/gcc, але вона не працює.


2
Я думаю, що це вдала практика встановлювати альтернативну версію gcc, /optа не /usr/local. Переважно /opt/gcc-x.y.z. Таким чином, якщо вам потрібна ще новіша версія, ви не матимете проблем із видаленням попередньої.
користувач666412

Відповіді:


219

Не перезаписуйте CMAKE_C_COMPILER, а експортуйте CCCXX) перед тим, як викликати cmake:

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

Експорт потрібно зробити лише один раз, при першому налаштуванні проекту, тоді ці значення будуть прочитані з кеша CMake.


ОНОВЛЕННЯ : довше пояснення того, чому не переосмислити CMAKE_C(XX)_COMPILERкоментар Джейка

Я рекомендую не змінювати значення CMAKE_C(XX)_COMPILER значення з двох основних причин: тому що воно не буде добре грати з кешем CMake і тому, що порушує перевірки компілятора та виявлення інструментів.

Під час використання setкоманди у вас є три варіанти:

  • без кешу, щоб створити нормальну змінну
  • з кешем, щоб створити кешовану змінну
  • примушувати кеш, щоб завжди налаштовувати значення кешу під час налаштування

Давайте подивимося, що відбувається з трьома можливими дзвінками до set:

Без кеша

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

Роблячи це, ви створюєте "звичайну" змінну, CMAKE_C(XX)_COMPILERяка приховує однойменну змінну кеша. Це означає, що ваш компілятор тепер зашифрований у вашому сценарії збірки, і ви не можете надати йому спеціальне значення. Це буде проблемою, якщо у вас є кілька середовищ збирання з різними компіляторами. Ви можете просто оновлювати свій скрипт щоразу, коли хочете використовувати інший компілятор, але це в першу чергу видаляє значення використання CMake.

Добре, тоді оновимо кеш ...

З кешем

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

Ця версія просто "не працює". CMAKE_C(XX)_COMPILERМінлива вже в кеші, тому він не буде оновлюватися , якщо не примусити його.

Ах ... давайте використаємо силу, тоді ...

Примусовий кеш

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

Це майже те саме, що і "звичайна" змінна версія. Єдина відмінність полягає в тому, що ваше значення буде встановлено в кеш-пам'яті, щоб користувачі могли його бачити. Але будь-яка зміна буде замінена setкомандою.

Порушення перевірок компілятора та інструментарій

На початку процесу конфігурації CMake здійснює перевірку компілятора: чи працює він? Чи здатний він створювати виконувані файли? Він також використовує компілятор для виявлення відповідних інструментів, таких як arі ranlib. Коли ви перекриваєте значення компілятора в сценарії, це "занадто пізно", усі перевірки та виявлення вже зроблені.

Наприклад, на моїй машині з gcc як компілятором за замовчуванням, коли використовується setкоманда до /usr/bin/clang, arвстановлено значення /usr/bin/gcc-ar-7. При використанні експорту перед запуском CMake він встановлений на /usr/lib/llvm-3.8/bin/llvm-ar.


Еквівалент для ледачих, якщо у вашому $ PATH встановлені відповідні компілятори:> export CC = which gcc > export CXX =which g++
gerardw

11
Еквівалент для ледачих, якщо у вашому $ PATH встановлені відповідні компілятори: export CC=`which gcc` export CXX=`which g++`
gerardw

Якщо CC / CXX відрізняються від шляху, я отримуюIncorrect 'gcc' version 'compiler.version=5.3' is not the one detected by CMake: 'GNU=4.8'
Річка Ліліт

1
Як це зробити, якщо я перебуваю в Windows?
mr5

5
На насправді, настройки CMAKE_C_COMPILERдобре працює при умови , ви робите це з допомогою командного рядка: $ cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ /path/to/source.
Ерван Легранд

25

Це питання досить старе, але все ще з’являється в Пошуку Google. Прийняте питання більше не працювало для мене і, здається, постаріло. Найновіша інформація про cmake написана у FAQ .

Існують різні способи змінити шлях вашого компілятора. Один із способів був би

Встановіть відповідну CMAKE_FOO_COMPILERзмінну (и) на дійсне ім'я компілятора або повний шлях у командному рядку, використовуючи cmake -D. Наприклад:

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

замість gcc-4.2вас можна написати path/to/your/compilerподібне

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

2
Я робив це під час створення старого проекту на старому компіляторі (GCC 5.3), тоді як новіший компілятор (GCC 7.3) знаходився в середовищі. Він склався чудово і працював на моїй машині, але, як тільки я перемістив виконуваний файл на іншу машину, я зрозумів, що програма пов'язана з libstdc ++. Так що з джерела 7.3 замість запитуваного 5.3 ...
Адам Бадура


3

Експорт повинен конкретно визначати, яку версію GCC / G ++ використовувати, тому що якби користувач мав декілька версій компілятора, він би не збирався успішно.

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

У разі використання проекту C ++ 11 це можна вирішити, використовуючи -std=C++-11прапор у CMakeList.txt


2

Альтернативне рішення - налаштувати ваш проект через cmake-gui, починаючи з чистого каталогу збірки. Серед доступних на початку варіантів є можливість вибрати точний шлях до компіляторів


2

Це не тільки працює з cmake, але і з ./configureі make:

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

У результаті чого:

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

0

Змініть CMAKE_<LANG>_COMPILERшлях, не викликаючи перенастроювання

Я хотів компілювати з альтернативним компілятором, але також передавати параметри -D у командному рядку, які будуть викреслені, встановивши інший компілятор. Це відбувається тому, що воно запускає повторну конфігурацію. Трюк полягає в тому, щоб вимкнути виявлення компілятора NONE, встановити шляхи за допомогою FORCE, а потім 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 )

Використовуйте файл 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++" )

Потім ви викликаєте Cmake додатковим прапором

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_file.cmake ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.