Язык программирования c++:
- высокоуровневый - компилируемый - статически типизированный - общего назначения
Как выбирать:
- стандарт C++ (98/11/14/17/20/...) - компилятор (gcc, msvc, clang)
Стандарты:
- синтаксис языка - семантика выражений (определяет что произойдёт если что то сделать) - состав стандартных библиотек
Стандарт не определяет:
- реализацию языка компилятором
- уровни оптимизации (есть рекомендации)
- последствия нарушения правил игры (undefined behavior)
       - некорректные конструкции
       - некорректные данные 
       - нечто, в стандарте не описанное
       - например: двойной вызов delete
       - например: переполнение знакового целого
- некоторые детали реализации (unspecified behavior)
       - несколько возможных вариантов
       - и все они корректны
       - и стандарт не говорит, какой предпочесть
       - например: порядок вычисления аргументов функций
Пример кода и сборка:
0. Создаем файл: vim hello_world.cpp ------------------- #includeint main () { std::cout << "Hello, world!" << std::endl; return 0; } ------------------- 1. Производим компиляцию: g++ hello_world.cpp -o hello -std=c++14 Где: g++ - компилятор hello_world.cpp - наш файл с кодом -o hello - наш бедующий бинарный файл -std=с++14 - версия языка c++ 
CMake
CMake
- кроссплатформенная система автоматизации сборки
- генерирует сборочные файлы
- много возможностей
Использование:
0. Описать свой проект в CMakeList.txt
1. cmake ${source_dir}
2. cmake --build .
3 cmake --build . --target install
Пример файла CMakeList.txt:
---------------------------
cmake_minimum_required(VERSION 3.5) - используемая версия cmake 
 
project(HelloWorld) - имя проекта
set(HEADERS
        version.h  - заголовочные файлы
)
set(SOURCES
        hello_world.cpp - файл с кодом
        version.cpp - файл с кодом
)
add_executable(hello_world ${HEADERS} ${SOURCES}) - действие - просим cmake собрать бинарник используя файлы с кодом (исходники)
set_target_properties(hello_world PROPERTIES - как будем собирать?
        CXX_STANDART 14 - используем стандарт си++ не ниже 14 версии
        CXX_STANDART_REQUIRED ON - придерживаемся стандарту си++ 
---------------------------
Реальный пример сборки сборочных файлов:
0. Cоздаем директорию build в каталоге с кодом
mkdir build  
1. Переходим в каталог build
cd build  
2. Производим сборку
cmake ..
3. После сборки выполняем ls, что бы увидеть что нам собрал cmake
ls
-------------------
CMakeCache.txt  
CMakeFiles
cmake_install.cmake  
Makefile
-------------------
4. Собственно выполняем сборку нашего проекта
!!! в windows проекты собираются в каталог Debug
!!! в linux бинарные файлы будут лежать где собираем проект
cmake --build .