How do I use CMake?

C++Visual StudioCmake

C++ Problem Overview

I am trying to use CMake in order to compile opencv.

I am reading the tutorial but can't understand what is CMakeLists files and how is it connected to the gui of CMake?

Also couldn't understand what are makefiles, are they the same is CMakeLists?

And which file is it which I in the end open with visual-studio?

C++ Solutions

Solution 1 - C++

I don't know about Windows (never used it), but on a Linux system you just have to create a build directory (in the top source directory)

mkdir build-dir

go inside it

cd build-dir

then run cmake and point to the parent directory

cmake ..

and finally run make


Notice that make and cmake are different programs. cmake is a Makefile generator, and the make utility is governed by a Makefile textual file. See cmake & make wikipedia pages.

NB: On Windows, cmake might operate so could need to be used differently. You'll need to read the documentation (like I did for Linux)

Solution 2 - C++

CMake takes a CMakeList file, and outputs it to a platform-specific build format, e.g. a Makefile, Visual Studio, etc.

You run CMake on the CMakeList first. If you're on Visual Studio, you can then load the output project/solution.

Solution 3 - C++

Yes, cmake and make are different programs. cmake is (on Linux) a Makefile generator (and Makefile-s are the files driving the make utility). There are other Makefile generators (in particular configure and autoconf etc...). And you can find other build automation programs (e.g. ninja).

Solution 4 - C++

CMake (Cross platform make) is a build system generator. It doesn't build your source, instead, generates what a build system needs: the build scripts. Doing so you don't need to write or maintain platform specific build files. CMake uses relatively high level CMake language which usually written in CMakeLists.txt files. Your general workflow when consuming third party libraries usually boils down the following commands:

cmake -S thelibrary -B build
cmake --build build
cmake --install build

The first line known as configuration step, this generates the build files on your system. -S(ource) is the library source, and -B(uild) folder. CMake falls back to generate build according to your system. it will be MSBuild on Windows, GNU Makefiles on Linux. You can specify the build using -G(enerator) paramater, like:

cmake -G Ninja -S libSource -B build

end of the this step, generates build scripts, like Makefile, *.sln files etc. on build directory.

The second line invokes the actual build command, it's like invoking make on the build folder.

The third line install the library. If you're on Windows, you can quickly open generated project by, cmake --open build.

Now you can use the installed library on your project with configured by CMake, writing your own CMakeLists.txt file. To do so, you'll need to create a your target and find the package you installed using find_package command, which will export the library target names, and link them against your own target.

Solution 5 - C++

Cmake from Windows terminal:

mkdir build
cd build/
cmake ..
cmake --build . --config Release

Solution 6 - C++

Regarding CMake 3.13.3, platform Windows, and IDE Visual Studio 2017, I suggest this guide. In brief I suggest:

  1. Download cmake > unzip it > execute it.
  2. As example download GLFW > unzip it > create inside folder Build.
  3. In cmake Browse "Source" > Browse "Build" > Configure and Generate.
  4. In Visual Studio 2017 Build your Solution.
  5. Get the binaries.


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionlital maatukView Question on Stackoverflow
Solution 1 - C++Basile StarynkevitchView Answer on Stackoverflow
Solution 2 - C++holtavoltView Answer on Stackoverflow
Solution 3 - C++Basile StarynkevitchView Answer on Stackoverflow
Solution 4 - C++user4640261View Answer on Stackoverflow
Solution 5 - C++BurakView Answer on Stackoverflow
Solution 6 - C++George TheodosiouView Answer on Stackoverflow