Как я могу заставить CMake использовать GCC вместо Clang в Mac OS X?

#c #cmake

#c #cmake

Вопрос:

Я не могу найти никакой информации об этом, но только наоборот (например, как настроить CMake на использование clang).

Я установил gcc-4.8 с помощью brew, настроил все зависимости, заголовки и т. Д., И теперь CMake отказывается использовать gcc.

Я установил свой профиль bash как с псевдонимами, так и с фактическими записями:

 export CC=/usr/bin/gcc
export CXX=/usr/bin/g  
alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g  ='g  -4.8'
alias c  ='c  -4.8'
  

Тем не менее, CMake упорно отказывается использовать gcc и вместо этого возвращается к clang:

 air:build alex$ cmake -DCMAKE_BUILD_TYPE=DEBUG ..
-- The C compiler identification is Clang 5.1.0
-- The CXX compiler identification is Clang 5.1.0
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
  

Комментарии:

1. Единственный способ, который я когда-либо находил для этого, — это изменить символические ссылки /usr/bin , что утомительно — должен быть лучший способ.

Ответ №1:

CMake не (всегда) прослушивает CC и CXX . Вместо этого используйте CMAKE_C_COMPILER и CMAKE_CXX_COMPILER :

 cmake -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g   ...
  

Смотрите также документацию.

В качестве альтернативы вы можете предоставить файл цепочки инструментов, но в данном случае это может быть излишним.

Комментарии:

1. @Alex: Зачем тебе это делать? CMakelists.txt предполагается, что он максимально зависит от платформы / цепочки инструментов. Никому ничего не навязывайте. Также смотрите эту запись CMake Wiki . Использование -D синтаксиса — это Correct™ способ.

2. @Pietro именно поэтому вы не стали бы жестко кодировать набор инструментов в своем CMakelists.txt , но вместо этого, когда вы выполняете тестовую сборку с помощью GCC на своем macbook, используйте приведенную выше команду (или какой-нибудь вариант с правильными путями, конечно …).

3. Этот ответ неверен. CMake поддерживает переменные среды CC и CXX. Единственное предостережение заключается в том, что вы должны установить их перед запуском CMake, а не перед запуском make внутри созданного каталога сборки. Кроме того, CMake кэширует значения этих переменных, поэтому после создания каталога сборки вам может потребоваться удалить каталог и сгенерировать его заново, если вы измените компиляторы.

4. На данный момент (3 года спустя) CMake CC работает и CXX в Linux, но не в macOS. Снова сталкиваюсь с проблемой…

5. @Eric CC / CXX используется только в случае Makefile (всех вариантов) и Ninja генераторов.

Ответ №2:

Текущие версии CMake не учитывают переменные среды CC и CXX, как и следовало ожидать. В частности, если они являются абсолютными путями к двоичным файлам компилятора, они, похоже, игнорируются. В моей системе с недавно скомпилированным cmake 3.7.1 я должен сделать cmake -H. -Bbuild -DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX .

Как заявляли другие, не стоит навязывать выбор компилятора в вашем CMakeLists.txt , однако, если это требуется для вашего варианта использования, вот как вы это делаете:

 cmake_minimum_required(VERSION 3.5) # Or whatever version you use

# THIS HAS TO COME BEFORE THE PROJECT LINE
set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g  ")
# THIS HAS TO COME BEFORE THE PROJECT LINE

project(my_project VERSION 0.0.0 LANGUAGES C CXX)
  

В этом случае cmake завершится ошибкой, если указанный компилятор не найден. Обратите внимание, что вы должны установить эти переменные перед строкой проекта, поскольку именно эта команда находит и настраивает компиляторы.

Ответ №3:

Я предполагаю, что случай в OP был запущен на macOS, и реальная проблема заключается /usr/bin/gcc в том, что и /usr/bin/g по умолчанию являются clang и clang .

 % ls -al /usr/bin/clang
-rwxr-xr-x  1 root  wheel  167088  8 Dec 07:39 /usr/bin/clang
% ls -al /usr/bin/gcc
-rwxr-xr-x  1 root  wheel  167088  8 Dec 07:39 /usr/bin/gcc
% /usr/bin/gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c  /4.2.1
Apple clang version 13.0.0 (clang-1300.0.29.30)
Target: x86_64-apple-darwin21.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
  

Один из способов избежать этого — установить gcc / g , а затем использовать двоичные имена с версиями.

 % which gcc-11 g  -11
/usr/local/bin/gcc-11
/usr/local/bin/g  -11
% gcc-11 --version
gcc-11 (Homebrew GCC 11.2.0_3) 11.2.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  

Итак, вместо

 cmake .. -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g  
  

можно было бы использовать

 cmake .. -DCMAKE_C_COMPILER=/usr/local/bin/gcc-11 -DCMAKE_CXX_COMPILER=/usr/local/bin/g  -11
  

Комментарии:

1. В моем случае (macOS Monterey) CC и CXX пусты, я добавил псевдонимы к правильному gcc (вместо стандартного gcc clang, настроенного XCode), и ВСЕ ЖЕ cmake игнорирует все это для абсолютного пути к инструментам XCode. Как вы сказали, вам нужно указать компилятор для CMake, но это не связано с ОС или системой, потому что Cmake все равно игнорирует ВСЕ это.

Ответ №4:

должно быть достаточно использовать CC CXX переменные среды и, но в macOS они «не работают должным образом».

но он работает таким образом, например:

 CXX="gcc-8" CC="gcc-8" cmake ..
  

Ответ №5:

Просто чтобы добавить это, существует также переменная CMake CMAKE_Fortran_COMPILER для выбора GNU FORTRAN вместо clang FORTRAN. Но, похоже, это отсутствует в документации

 cmake -DCMAKE_Fortran_COMPILER=/usr/.../bin/gfortran-6.x.0