Базовый Makefile состоит из:
Пример простого Makefile:
CC = g++
CFLAGS = -Wall -Wextra -std=c++17
TARGET = myapp
SRCS = main.cpp utils.cpp
OBJS = $(SRCS:.cpp=.o)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: clean
Автоматические переменные:
$@
- имя цели$<
- первая зависимость$^
- все зависимостиГенерация зависимостей:
DEPFLAGS = -MMD -MP
-include $(SRCS:.cpp=.d)
%.o: %.cpp
$(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
make -j8 # Сборка с использованием 8 ядер
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(myapp main.cpp utils.cpp)
target_include_directories(myapp PRIVATE include)
target_link_libraries(myapp PRIVATE Threads::Threads)
# Корневой CMakeLists.txt
add_subdirectory(src)
add_subdirectory(tests)
# src/CMakeLists.txt
add_library(mylib STATIC utils.cpp)
target_include_directories(mylib PUBLIC include)
install(TARGETS mylib
EXPORT MyLibTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
INCLUDES DESTINATION include
)
install(EXPORT MyLibTargets
FILE MyLibTargets.cmake
DESTINATION lib/cmake/MyLib
)
if(UNIX AND NOT APPLE)
find_package(X11 REQUIRED)
target_link_libraries(myapp PRIVATE X11::X11)
endif()
Характеристика | Make | CMake |
---|---|---|
Кроссплатформенность | Ограниченная | Полная |
Управление зависимостями | Ручное | Автоматическое |
Поддержка IDE | Минимальная | Отличная |
Сложность проектов | Простые/средние | Любые |
Генерация | Только make | Make, Ninja, VS, Xcode и др. |
Для Make:
-jN
для параллельной сборкиДля CMake:
CMAKE_EXPORT_COMPILE_COMMANDS
для инструментов анализаadd_subdirectory
Общие рекомендации:
CLion:
VSCode:
Отладка:
make --debug=j
cmake --trace-expand
Резюмируем: Make отлично подходит для небольших проектов с простыми зависимостями, тогда как CMake является стандартом для сложных кроссплатформенных проектов. Современная разработка на C++ чаще использует CMake как более мощный и поддерживаемый инструмент.