#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