Linux下CMake入门

CMake的基础知识

  1. 什么是 CMake
  • CMake 是一个跨平台的构建工具,主要用于管理构建过程。CMake 不直接构建项目,而是生成特定平台上的构建系统(如 Unix 下的 Makefile,Windows 下的 Visual Studio 工程),然后通过这些构建系统来进行编译和链接
  1. CMake 的基本流程

    CMake 的工作流程通常如下:

    1. 编写 CMakeLists.txt 文件来定义项目的构建逻辑。
    2. 使用 cmake 命令生成构建文件(如 Makefile)。
    3. 运行生成的构建系统(如 make)来构建项目。
  2. 例子如下

    cpp 复制代码
    //一个简单的 C++ 项目,文件结构如下
    project/
    ├── CMakeLists.txt
    ├── main.cpp
    
    //main.cpp
    #include <iostream>
    
    int main() {
        std::cout << "Hello, CMake!" << std::endl;
        return 0;
    }
    
    //CMakeLists.txt
    cmake_minimum_required(VERSION 3.10)  # 设置最低 CMake 版本要求
    project(HelloCMake)                    # 定义项目名称
    
    set(CMAKE_CXX_STANDARD 11)             # 设置 C++ 标准
    add_executable(hello main.cpp)         # 定义生成的可执行文件
    • 构建步骤
      1. 创建构建目录并进入
    cpp 复制代码
    mkdir build
    cd build
    复制代码
     2. 运行 CMake 生成构建文件
    bash 复制代码
    cmake ..
    # .. 指的是上一级目录(也称为父目录)。在运行 cmake 命令时,指定的是包含 CMakeLists.txt 文件的路径。
    复制代码
     3. 构建项目
    bash 复制代码
    make
    复制代码
     4. 运行生成的可执行文件
    bash 复制代码
    ./hello

CMake 的基本指令

  1. cmake_minimum_required
bash 复制代码
# 指定 CMake 运行所需的最低版本,例如
cmake_minimum_required(VERSION 3.10)
  1. project
bash 复制代码
# 定义项目的名称和相关的语言
project(MyProject LANGUAGES C CXX)
  1. set
bash 复制代码
# 设置变量值。常用于设置编译选项、路径等
set(CMAKE_CXX_STANDARD 11)  # 设置 C++ 标准为 C++11
set(SOURCE_FILES main.cpp file1.cpp file2.cpp)  # 定义源文件列表
  1. add_executable
bash 复制代码
# 定义要生成的可执行文件。你需要给出目标名称和源文件列表
定义要生成的可执行文件。你需要给出目标名称和源文件列表
  1. add_library
bash 复制代码
# 用于生成静态或动态库
# 生成静态库
add_library(mylib STATIC file1.cpp file2.cpp)

# 生成动态库
add_library(mylib SHARED file1.cpp file2.cpp)
  1. target_link_libraries
bash 复制代码
# 用于链接外部库或内部库
target_link_libraries(my_program mylib)  # 链接自定义库
target_link_libraries(my_program PUBLIC pthread)  # 链接系统库
  1. include_directories
bash 复制代码
# 为项目指定头文件目录
include_directories(/path/to/headers)

管理多个源文件和目录

举例说明

  1. 假设项目结构如下
css 复制代码
project/
├── CMakeLists.txt
├── src/
│   ├── CMakeLists.txt
│   ├── main.cpp
│   ├── file1.cpp
│   ├── file2.cpp
└── include/
    └── file1.h
    └── file2.h
  1. 顶层 CMakeLists.txt
bash 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

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

# 添加 include 目录
include_directories(${PROJECT_SOURCE_DIR}/include)

# 递归处理 src 目录
add_subdirectory(src)
  1. src/CMakeLists.txt
bash 复制代码
# 定义源文件列表
set(SOURCE_FILES main.cpp file1.cpp file2.cpp)

# 生成可执行文件
add_executable(my_program ${SOURCE_FILES})
  1. 构建项目
bash 复制代码
mkdir build
cd build
cmake ..
make

跨平台和编译器支持

CMake 的一个优势在于它能够支持多平台和多编译器。你可以通过 CMake 生成 Visual Studio、Xcode 工程文件,或者为其他平台生成 Makefile。

  1. 生成不同平台的构建文件
  • G关键字
bash 复制代码
# 生成 Unix Makefile(默认)
cmake ..

# 生成 Visual Studio 工程
cmake -G "Visual Studio 16 2019" ..

# 生成 Xcode 工程
cmake -G "Xcode" ..
  1. 支持多编译器(D)
bash 复制代码
# 可以通过 CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 变量指定编译器
cmake -D CMAKE_C_COMPILER=gcc -D CMAKE_CXX_COMPILER=g++ ..
相关推荐
hflmwl82 小时前
Motrix电脑版官网免费下载,motrix服务器绿色版官方下载安装
运维·服务器·motrix
LongRunning2 小时前
【Linux】RK3568(三)操作-视频流
linux
Discipline~Hai2 小时前
Linux网络编程02-TCP协议
linux·网络·tcp/ip·嵌入式·linux网络编程
智恒百亿2 小时前
RTX5090 八卡算力服务器:解析大模型私有化部署热门硬件的市场现状
运维·服务器·ai算力
java_logo2 小时前
Docker 部署 HertzBeat:轻松搭建无代理实时监控与告警平台
运维·docker·容器·监控告警·部署教程·hertzbeat·轩辕镜像
gsls2008082 小时前
OpsKat封装MCP:用 Go 标准库把运维 CLI 变成 AI 的“手“
运维·人工智能·golang·mcp
abc light2 小时前
Linux TCP网络
linux·网络·tcp/ip
元岳数字人小元2 小时前
数字人一体机如何落地?多模态智能交互设备全解析
运维·人工智能·人机交互·交互·源代码管理
Jason_zhao_MR3 小时前
电能质量监测为什么需要PTP精确时钟同步
linux·单片机·嵌入式硬件·嵌入式
视觉小萌新3 小时前
A1——基于AMD-48G显卡下载Gemma4模型
linux·ubuntu