Как указать конкретный компилятор для сборок CMAKE в Windows? - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь заставить CMAKE использовать определенный компилятор при запуске. В частности, я хочу использовать локально установленный компилятор GCC. Но когда я пытаюсь установить переменную CMAKE_C_COMPILER , кажется, что это не удается.

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")

cmake_minimum_required(VERSION 3.10)

PROJECT(hello C)

add_executable(hello hello.c)

ОБНОВЛЕНИЕ С ИСПОЛЬЗОВАНИЕМ TOOLCHAIN ​​

Я попытался заставить его работать, используя следующий файл инструментария, но он по-прежнему выбирает инструменты сборки Visual Studio.

# Toolchain File

# The target of this operating systems is 
SET(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
SET(CMAKE_C_COMPILER gcc)
SET(CMAKE_CXX_COMPILER g++)

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  C:/MyPrograms/MinGW/bin/ )

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

БОЛЬШЕ ОБНОВЛЕНИЙ НА ВЫПУСКЕ

Когда я смотрю на файл кэша, созданный при использовании файла toolchain, я нахожу что-то интересное. Он пытается указать на правильный компилятор, но он все еще использует генератор Visual Studio ...

//Name of generator.
CMAKE_GENERATOR:INTERNAL=Visual Studio 15 2017
//Generator instance identifier.
CMAKE_GENERATOR_INSTANCE:INTERNAL=C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/ 

Как мне разобраться с генератором здесь?

1 Ответ

1 голос
/ 21 мая 2019

CMake - это инструмент, предназначенный для определения зависимостей среди целей в вашем приложении.Вы определяете зависимости и устанавливаете языковые требования для ваших целей, и вы просите CMake сгенерировать файлы, которые помогут вам построить ваши цели.Имея это в виду, пожалуйста, не связывайтесь с переменными CMAKE_C(XX)_COMPILER непосредственно в ваших CMakeLists.txt, а скорее подумайте об использовании файлов toolchain для определения конкретных свойств компилятора / компоновщика.Используя файлы наборов инструментов, вы можете не только определять различные настройки компилятора / компоновщика для своего хоста, но также выполнять кросс-компиляцию, в которой хост и целевые устройства имеют разную архитектуру.

EDIT. Чтобы использовать локально установленный компилятор gcc, вам не нужно играть с любой (связанной) переменной внутри вашего файла CMakeLists.txt.Вместо этого вы должны (пере) определить переменную окружения PATH, включив в нее соответствующие (т.е. MinGW или Cygwin) двоичные файлы, и выбрать подходящий генератор.Ниже приведен минимальный рабочий пример, основанный на вашем коде.

Предположим, что у вас есть следующая структура каталогов:

.
├── appveyor.yml
├── CMakeLists.txt
└── hello.c

с hello.c, имеющим содержимое

#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("Hello world!\n");
  return 0;
}

CMakeLists.txt с содержимым

cmake_minimum_required(VERSION 3.10)
project(hello C)
add_executable(hello hello.c)

и, наконец, appveyor.yml с следующим

image: Visual Studio 2013

environment:
  matrix:
    - generator: "Visual Studio 12 2013 Win64"
    - generator: "MSYS Makefiles"

before_build:
  - IF "%generator%"=="MSYS Makefiles" set PATH=C:\msys64\usr\bin;C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\bin;%PATH%

build_script:
  - mkdir build
  - cd build
  - cmake -G "%generator%" ..
  - cmake --build .

after_build:
  - IF EXIST Debug cd Debug
  - hello.exe

Этот пример успешно построен на AppVeyor с обеими цепями инструментов.Уловка здесь в том, что когда вы выбираете MSYS Makefiles или MinGW Makefiles в этом отношении, вы должны определить переменную PATH, чтобы включить двоичные файлы в цепочку инструментов компилятора.В приведенном выше примере я просто использую пути по умолчанию для виртуальных машин AppVeyor .Еще одна вещь, которую стоит отметить для appveyor.yml, - это то, что генераторы Visual Studio используют разные (под) каталоги для разных CMAKE_BUILD_TYPE s.Следовательно, я сначала проверяю наличие каталога Debug, и если он существует, я переключаюсь на каталог и запускаю hello.exe.

Я надеюсь, что это отвечает на ваш вопрос.

...