Cmake cxx compiler windows

CMake error at CMakeLists.txt:30 (project): No CMAKE_C_COMPILER could be found

I’m trying make a Visual Studio solution with CMake to compile the latest version of aseprite and CMake keeps giving me the:

I’ve already downloaded GCC, and I’m using Visual Studio 2015.

I’m following this tutorial:

19 Answers 19

Those error messages

just mean that CMake was unable to find your C/CXX compiler to compile a simple test program (one of the first things CMake tries while detecting your build environment).

The steps to find your problem are dependent on the build environment you want to generate. The following tutorials are a collection of answers here on Stack Overflow and some of my own experiences with CMake on Microsoft Windows 7/8/10 and Ubuntu 14.04.

Preconditions

  • You have installed the compiler/IDE and it was able to once compile any other program (directly without CMake)
    • You e.g. may have the IDE, but may not have installed the compiler or supporting framework itself like described in Problems generating solution for VS 2017 with CMake or How do I tell CMake to use Clang on Windows?
  • You have the latest CMake version
  • You have access rights on the drive you want CMake to generate your build environment

    You have a clean build directory (because CMake does cache things from the last try) e.g. as sub-directory of your source tree

    Windows cmd.exe

    Bash shell

    and make sure your command shell points to your newly created binary output directory.

    General things you can/should try

    Is CMake able find and run with any/your default compiler? Run without giving a generator

    Perfect if it correctly determined the generator to use — like here Visual Studio 14 2015

    What was it that actually failed?

    In the previous build output directory look at CMakeFiles\CMakeError.log for any error message that make sense to you or try to open/compile the test project generated at CMakeFiles\[Version]\CompilerIdC | CompilerIdCXX directly from the command line (as found in the error log).

    CMake can’t find Visual Studio

    Try to select the correct generator version:

    If that doesn’t help, try to set the Visual Studio environment variables first (the path could vary):

    or use the Developer Command Prompt for VS2015 short-cut in your Windows Start Menu under All Programs / Visual Studio 2015 / Visual Studio Tools (thanks at @Antwane for the hint).

    Background: CMake does support all Visual Studio releases and flavors (Express, Community, Professional, Premium, Test, Team, Enterprise, Ultimate, etc.). To determine the location of the compiler it uses a combination of searching the registry (e.g. at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[Version];InstallDir ), system environment variables and — if none of the others did come up with something — plainly try to call the compiler.

    CMake can’t find GCC (MinGW/MSys)

    You start the MSys bash shell with msys.bat and just try to directly call gcc

    Here it did find gcc and is complaining that I didn’t gave it any parameters to work with.

    So the following should work:

    If GCC was not found call export PATH=. to add your compilers path (see How to set PATH environment variable in CMake script?) and try again.

    If it’s still not working, try to set the CXX compiler path directly by exporting it (path may vary)

    Note: When using the «MinGW Makefiles» generator you have to use the mingw32-make program distributed with MinGW

    Still not working? That’s weird. Please make sure that the compiler is there and it has executable rights (see also preconditions chapter above).

    Otherwise the last resort of CMake is to not try any compiler search itself and set CMake’s internal variables directly by

    Alternatively those variables can also be set via cmake-gui.exe on Windows. See Cmake cannot find compiler

    Background: Much the same as with Visual Studio. CMake supports all sorts of GCC flavors. It searches the environment variables (CC, CXX, etc.) or simply tries to call the compiler. In addition it will detect any prefixes (when cross-compiling) and tries to add it to all binutils of the GNU compiler toolchain ( ar , ranlib , strip , ld , nm , objdump , and objcopy ).

    For Ubuntu, please install the below things:

    This happened to me after I installed Visual Studio 15 2017.

    The C++ compiler for Visual Studio 14 2015 was not the problem. It seemed to be a problem with the Windows 10 SDK.

    Adding the Windows 10 SDKs to Visual Studio 14 2015 solved the problem for me.

    See attached screenshot.

    I also experienced this error when working with CMake:

    The ‘warning’ box in the MSDN library article Visual C++ in Visual Studio 2015 gave me the help that I needed.

    Visual Studio 2015 doesn’t come with C++ installed by default. So, creating a new C++ project will prompt you to download the necessary C++ components.

    This works for me in Ubuntu 17.10 (Artful Aardvark):

    I ran into this issue while building libgit2-0.23.4. For me the problem was that C++ compiler & related packages were not installed with VS2015, therefore «C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat» file was missing and Cmake wasn’t able to find the compiler.

    I tried manually creating a C++ project in the Visual Studio 2015 GUI (C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe) and while creating the project, I got a prompt to download the C++ & related packages.

    After downloading required packages, I could see vcvarsall.bat & Cmake was able to find the compiler & executed successfully with following log:

    I had the same errors with CMake. In my case, I have used the wrong Visual Studio version in the initial CMake dialog where we have to select the Visual Studio compiler.

    Then I changed it to «Visual Studio 11 2012» and things worked. (I have Visual Studio Ultimate 2012 version on my PC). In general, try to input an older version of Visual Studio version in the initial CMake configuration dialog.

    For me, this problem went away on Windows when I moved my project to a shallower parent directory, i.e. to:

    I think the source of the problem was that MSBuild has a file path length restriction to 260 characters. This causes the basic compiler test CMake performs to build a project called CompilerIdCXX.vcxproj to fail with the error:

    C1083: Cannot open source file: ‘CMakeCXXCompilerId.cpp’

    because the length of the file’s path e.g.

    C:\Users\spenc\Desktop\. \MyProjectDirectory\build\CMakeFiles\. \CMakeCXXCompilerId.cpp

    exceeds the MAX_PATH restriction.

    CMake then concludes there is no CXX compiler.

    Make sure you have selected the correct version of Visual Studio. This is trickier than it seems because Visual Studio 2015 is actually Visual Studio 14, and similarly Visual Studio 2012 is Visual Studio 11. I had incorrectly selected Visual Studio 15 which is actually Visual Studio 2017, when I had 2015 installed.

    None of the solutions here solves my problem — only when I install Windows Update for universal C runtime.

    Now CMake is working and no more link hangs from Visual Studio.

    You can also make sure you are the sudo user and you have READ/WRITE access on the directory you are working. I had a similar problem on OS X, and I got it fixed just by entering in sudo mode.

    Just in case it helps any one like me in future:

    I have had this issue for 24 hours now, on 3 different 64-bit machines(Win7 , Windows 8.1 VM and WIn 8.1 laptop) — whilst trying to build WebKit with VS 2017.

    The simple issue here is that the VC++ compiler (i.e cl.exe and it’s dependent DLLs) is not visible to CMake. Simple. By making the VC++ folders containing those binaries visible to CMake and your working command prompt(if you’re running Cmake from a command prompt), voila! (In addition to key points raised by others , above)

    Anyway, after all kinds of fixes — as posted on these many forums- I discovered that it was SIMPLY a matter of ensuring that the PATH variable’s contents are not cluttered with multiple Visual Studio BIN paths etc; and instead, points to :

    a) the location of your compiler (i.e. cl.exe for your preferred version of Visual Studio ), which in my case(targeting 64-bit platform, and developing on a 64-bit host) is: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\Hostx64\x64

    b) and in addition, the folder containing a dependent DLL called (which cl.exe is dependent on): api-ms-win-crt-runtime-l1-1-0.dll — which on my machine is:

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Remote Debugger\x64

    These two directories being added to a simplified and CUSTOM System Path variable(working under a Admin priviledged commmand prompt), eliminated my «No CMAKE_C_COMPILER could be found» and «No CMAKE_CXX_COMPILER could be found.» errors.

    Cmake cxx compiler windows

    На первом шаге проект нужно сконфигурировать, то есть создать финальный скрипт сборки, запустив cmake в будущем каталоге сборки.

    На втором шаге нужно запустить финальный скрипт. Не вызывайте make ! Утилита cmake сделает это сама:

    Структура CMakeLists.txt

    В начале главного файла CMakeLists.txt ставят метаинформацию о минимальной версии CMake и названии проекта:

    Затем следует список инструкций, служащих для вычисления различных переменных, создания целей сборки, подключения проектов из подкаталогов и так далее. Например, подключить дополнительный CMakeLists.txt из подкаталога можно так:

    Целью может стать исполняемый файл, собираемый из исходного кода

    Целью также может быть библиотека, статическая или динамическая.

    Автогенерация проекта для Visual Studio (Windows)

    Если используется Visual C++, то путь немного другой: на шаге конфигурирования создаётся проект для Visual Studio, который затем можно собрать из IDE либо так же из командной строки.

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

    Если проект был сконфигурирован успешно, то в каталоге ../myapp-build появятся автоматически сгенерированный BUILD_ALL.sln и проекты для Visual Studio. Их можно открыть к IDE, либо собрать из командной строки с помощью cmake. Названия опций говорят сами за себя:

    Зависимости между библиотеками и приложениями

    Не используйте директивы include_directories , add_definitions , add_compile_options ! Они меняют глобальные настройки для всех целей, это создаёт проблемы при масштабировании.

    • Используйте target_link_libraries для добавления статических и динамических библиотек, от которых зависит цель
    • Используйте target_include_directories вместо include_directories для добавления путей поиска заголовков, от которых зависит цель
    • Используйте target_compile_definitions вместо add_definitions для добавления макросов, с которыми собирается цель
    • Используйте target_compile_options для добавления специфичных флагов компилятора, с которыми собирается цель

    Вы можете выбирать область видимости настройки:

    • PUBLIC делает настройку видимой для текущей цели и для всех зависящих от неё целей
    • PRIVATE делает настройку видимой только для текущей цели
    • INTERFACE делает настройку видимой только для всех зависящих от неё целей

    Пример использования областей видимости:

    Схема зависимостей условного проекта:

    Выбор стандарта и диалекта C++

    Для настройки стандарта и флагов языка C++ не добавляйте флаги напрямую!

    В CMake версии 3.8+ вы можете прямо потребовать включить нужный стандарт:

    В CMake версии до 3.7 включительно можно использовать set_target_properties (если не работает, то у вас слишком старый CMake):

    Для разработчиков библиотек есть более тонкий контроль над возможностями языка:

    Функции в CMake

    CMake позволяет объявлять функции командами function(name) / endfunction() и макросы командами macro(name) / endmacro() . Предпочитайте функции, а не макросы, т.к. у функций есть своя область видимости переменных, а у макросов — нет.

    Добавление исходников к цели с target_sources

    Лучше добавлять специфичные исходники с помощью target_sources, а не с помощью дополнительных переменных.

    Интерфейс к утилитам командной строки

    Функция find_package

    Функция find_package принимает имя библиотеки как аргумент и обращается к CMake, чтобы найти скрипт для настройки переменных данной библиотеки. В итоге при сборке либо возникает ошибка из-за того что пакет не найден, либо добавляются переменные, хранящие пути поиска заголовков, имена библиотек для компоновщика и другие параметры.

    Пример подключения Boost, вызывающего встроенный в CMake скрипт FindBoost:

    Пример подключения библиотеки Bullet с помощью встроенного скрипта FindBullet и компоновки с приложением my_app:

    CMake -DCMAKE_CXX_COMPILER works but SET(CMAKE_CXX_COMPILER …) is ignored?

    Been messing around trying to set the CPP compiler to g++ using the following line in my toolchain file.

    This didn’t appear to be used, so I tried something right out just to be sue

    Okay, overkill, but this way I’m definitely sure CMake isn’t doing any funny inferences from the path and command structure I was passing in.

    I’d gone down this route by looking at the CMake Cross Compiling page where it talks about toolchain files.

    So read around a bit and decided to do it from the command line as this QA thread showed that the command line -D would override cached vars.

    So my question is, does anyone know why when I do not use the -D command line option how CMake finds my cross-compiler path and exename but ignores the SET(CMAKE_CXX_COMPILER. line in my toolchain.

    I have, before each build deleted the build directory and the CMakeCache.txt file.

    For completeness the command line I’m using is

    The file CMakeCrossCompile-TryRunResult-qnx-armle.cmake does not contain CMAKE_CXX_COMPILER .

    Any clue to what’s giong on much appreciated!

    I also used the -LA command line option to see the cached variables being used and its definitely not getting the right value from the SET command when the command linne -D. is not present.

    It seems that using the variables in the ToolChain file might be too late in the process? Strange, because it shows this method in the guide linked to above. Can any confirm/deny this? Thanks.

    Читайте также:  Как работает path windows
Оцените статью