CMake Quick Guide

Abstract

CMake Quick Guide

Authors

Walter Fan

Status

v1.0

Updated

2026-03-20

Overview

CMake 是一个跨平台的构建系统生成器,通过 CMakeLists.txt 文件描述项目的构建规则, 然后生成对应平台的原生构建文件 (如 Makefile、Visual Studio 工程、Ninja 文件等)。 虽然 WebRTC 本身使用 GN + Ninja 构建,但许多基于 WebRTC 的应用项目使用 CMake。

基本语法

CMake 使用命令式语法,命令不区分大小写 (但惯例小写),参数用空格或分号分隔。

# 设置最低 CMake 版本
cmake_minimum_required(VERSION 3.16)

# 定义项目名称和语言
project(MyWebRTCApp VERSION 1.0 LANGUAGES CXX)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 定义变量
set(SRC_DIR ${CMAKE_SOURCE_DIR}/src)

# 条件判断
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  message(STATUS "Building on Linux")
elseif(APPLE)
  message(STATUS "Building on macOS")
endif()

# 循环
foreach(src main.cpp peer.cpp signaling.cpp)
  message(STATUS "Source: ${src}")
endforeach()

CMakeLists.txt 结构

一个典型的 CMakeLists.txt 包含以下部分:

# 1. 项目声明
cmake_minimum_required(VERSION 3.16)
project(WebRTCDemo LANGUAGES CXX)

# 2. 选项和配置
option(USE_H264 "Enable H.264 support" ON)
option(BUILD_TESTS "Build unit tests" OFF)

# 3. 查找依赖
find_package(PkgConfig REQUIRED)
pkg_check_modules(WEBRTC REQUIRED libwebrtc)
find_package(OpenSSL REQUIRED)

# 4. 添加源文件
set(SOURCES
  src/main.cpp
  src/peer_connection.cpp
  src/signaling_client.cpp
  src/video_capturer.cpp
)

# 5. 定义目标
add_executable(webrtc_demo ${SOURCES})

# 6. 设置头文件路径
target_include_directories(webrtc_demo PRIVATE
  ${CMAKE_SOURCE_DIR}/include
  ${WEBRTC_INCLUDE_DIRS}
)

# 7. 链接库
target_link_libraries(webrtc_demo PRIVATE
  ${WEBRTC_LIBRARIES}
  OpenSSL::SSL
  OpenSSL::Crypto
  pthread
)

# 8. 编译选项
target_compile_definitions(webrtc_demo PRIVATE
  WEBRTC_POSIX
  WEBRTC_LINUX
)

常用命令

目标定义

# 可执行文件
add_executable(app main.cpp)

# 静态库
add_library(mylib STATIC lib.cpp)

# 动态库
add_library(mylib SHARED lib.cpp)

# 头文件库 (header-only)
add_library(mylib INTERFACE)

依赖管理

# 查找系统安装的库
find_package(Threads REQUIRED)

# 使用 pkg-config
find_package(PkgConfig REQUIRED)
pkg_check_modules(OPUS REQUIRED opus)

# 使用 FetchContent 下载依赖
include(FetchContent)
FetchContent_Declare(json
  GIT_REPOSITORY https://github.com/nlohmann/json.git
  GIT_TAG v3.11.2
)
FetchContent_MakeAvailable(json)

安装规则

install(TARGETS webrtc_demo DESTINATION bin)
install(FILES include/api.h DESTINATION include)

WebRTC 相关构建示例

以下是一个链接 WebRTC 静态库的完整示例:

cmake_minimum_required(VERSION 3.16)
project(WebRTCApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

# WebRTC 源码路径
set(WEBRTC_SRC_DIR "/path/to/webrtc/src" CACHE PATH "WebRTC source")
set(WEBRTC_BUILD_DIR "${WEBRTC_SRC_DIR}/out/Release" CACHE PATH "WebRTC build")

add_executable(webrtc_app
  src/main.cpp
  src/conductor.cpp
  src/peer_connection_client.cpp
)

target_include_directories(webrtc_app PRIVATE
  ${WEBRTC_SRC_DIR}
  ${WEBRTC_SRC_DIR}/third_party/abseil-cpp
  ${WEBRTC_SRC_DIR}/third_party/libyuv/include
)

# WebRTC 编译宏定义
target_compile_definitions(webrtc_app PRIVATE
  WEBRTC_POSIX
  WEBRTC_LINUX
  NDEBUG
)

# 链接 WebRTC 静态库和系统依赖
target_link_libraries(webrtc_app PRIVATE
  ${WEBRTC_BUILD_DIR}/obj/libwebrtc.a
  dl pthread rt
  X11 Xext Xdamage Xfixes Xcomposite Xrandr
)

构建和运行:

mkdir build && cd build
cmake .. -DWEBRTC_SRC_DIR=/path/to/webrtc/src
cmake --build . -j$(nproc)
./webrtc_app

参考资料