如何使用 Makefile 和 CMakeLists

151 阅读2分钟

MakefileCMake 是两种常用的构建工具,用于管理和编译 C/C++ 项目。以下是它们的基本用法和示例。


  1. 使用 Makefile

Makefile 是一个文本文件,定义了如何编译和链接项目。make 工具会根据 Makefile 中的规则自动构建项目。

  1. 安装 make

  • 在 Linux 上,通常已经预装了 make。如果没有,可以通过以下命令安装:
sudo apt update
sudo apt install make
  • 在 macOS 上,make 通常已经预装。

  • 在 Windows 上,可以通过 MinGWMSYS2 安装。

  1. 编写 Makefile

假设你有一个简单的 C++ 项目,包含以下文件:

  • main.cpp(主程序)

  • utils.cpp(工具函数)

  • utils.h(工具函数头文件)

示例 Makefile

# 编译器
CXX = g++

# 编译选项
CXXFLAGS = -Wall -std=c++11

# 目标可执行文件
TARGET = my_program

# 源文件
SRCS = main.cpp utils.cpp

# 生成的目标文件
OBJS = $(SRCS:.cpp=.o)

# 默认目标
all: $(TARGET)

# 生成可执行文件
$(TARGET): $(OBJS)
        $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)

# 生成目标文件
%.o: %.cpp
        $(CXX) $(CXXFLAGS) -c $< -o $@

# 清理生成的文件
clean:
        rm -f $(OBJS) $(TARGET)
  1. 使用 Makefile

  1. 编译项目
make

这会生成可执行文件 my_program

  1. 运行程序
./my_program
  1. 清理生成的文件
make clean

这会删除生成的目标文件和可执行文件。


  1. 使用 CMake(CMakeLists.txt)

CMake 是一个跨平台的构建工具,可以生成适用于不同编译器和操作系统的构建文件(如 Makefile 或 Visual Studio 项目文件)。

  1. 安装 CMake

  • 在 Linux 上:
sudo apt update
sudo apt install cmake
  • 在 macOS 上:
brew install cmake
  • 在 Windows 上,可以从 CMake 官网 下载安装程序。

  1. 编写 CMakeLists.txt

假设你有一个简单的 C++ 项目,包含以下文件:

  • main.cpp(主程序)

  • utils.cpp(工具函数)

  • utils.h(工具函数头文件)

示例 CMakeLists.txt

# 最低 CMake 版本要求
cmake_minimum_required(VERSION 3.10)

# 项目名称
project(MyProject)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加可执行文件
add_executable(MyProject main.cpp utils.cpp)
  1. 使用 CMake 构建项目

  2. 创建构建目录

mkdir build
cd build
  1. 生成构建文件
cmake ..

这会生成适用于当前平台的构建文件(如 Makefile)。

  1. 编译项目
make

这会生成可执行文件 MyProject

  1. 运行程序
./MyProject
  1. 清理生成的文件
make clean

或者直接删除 build 目录:

cd ..
rm -rf build

  1. Makefile 和 CMake 的区别

| 特性 | Makefile | CMake |

|-------------------|----------------------------------------|----------------------------------------------|

| 跨平台支持 | 需要手动编写不同平台的规则 | 自动生成适用于不同平台的构建文件 |

| 易用性 | 适合小型项目,语法较复杂 | 适合中大型项目,语法更简洁 |

| 依赖管理 | 需要手动管理依赖 | 自动管理依赖 |

| 扩展性 | 有限 | 强大,支持模块化和插件 |


4. 总结

  • Makefile :适合小型项目,直接控制编译过程。

  • CMake :适合中大型项目,跨平台支持更好,语法更简洁。

根据项目需求选择合适的工具!