用 CMake 管理多文件项目 —— C++ 项目的标准构建系统
为什么用 CMake
当项目只有一个 main.cpp 时,直接在 Cxxdroid 单文件编译就行。但随着项目变大:
- 多个 .cpp 文件需要一起编译
- 需要链接第三方库
- 不同平台(手机 / 桌面 / Linux / Windows)编译参数不同
这时手动管理编译命令变得不可行——每次都要记住一堆 -I、-l 参数,改一个文件就要重新调命令。
CMake 解决这个问题:用一份声明式的 CMakeLists.txt 描述「我的项目需要什么」,CMake 自动生成对应的构建脚本。
Cxxdroid 里的 CMake
Cxxdroid 内置了 CMake(预编译好的 Android arm64 版本)。你创建 C++ 项目时,应用会自动生成一个最小化的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(CMAKE_CXX_STANDARD 17)
add_executable(myproject main.cpp)
核心 CMake 语句速查
添加可执行文件
add_executable(mygame main.cpp utils.cpp game.cpp)
所有 .cpp 文件一起编译,链接成 mygame 可执行文件。
设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
常见的标准选择:C++17(推荐,很多库需要)、C++20(需要新版 Clang)、C++14(最兼容)。
链接第三方库
find_package(SDL2 REQUIRED)
find_package(Boost REQUIRED COMPONENTS system filesystem)
find_package(SQLite3 REQUIRED)
target_link_libraries(mygame PRIVATE
SDL2::SDL2
Boost::system Boost::filesystem
SQLite::SQLite3
)
装过的库 find_package 就能找到,不需要手动写路径。
头文件目录
target_include_directories(mygame PRIVATE include/)
如果你的头文件不在默认位置(比如放在项目根目录下的 include/ 文件夹),需要显式添加。
编译选项
target_compile_options(mygame PRIVATE -Wall -Wextra -Wpedantic)
target_compile_definitions(mygame PRIVATE DEBUG_MODE=1)
-Wall -Wextra 开启更多警告(推荐始终打开),-D 添加宏定义。
一个完整的 CMakeLists.txt 示例
cmake_minimum_required(VERSION 3.14)
project(cxxdroid-sdl-game)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找 SDL2
find_package(SDL2 REQUIRED)
# 添加可执行文件
add_executable(game
src/main.cpp
src/game.cpp
src/player.cpp
src/render.cpp
)
# 头文件目录
target_include_directories(game PRIVATE include/)
# 链接 SDL2
target_link_libraries(game PRIVATE SDL2::SDL2)
# 编译警告
target_compile_options(game PRIVATE -Wall -Wextra)
目录结构:
项目/
├── CMakeLists.txt
├── include/
│ ├── game.h
│ ├── player.h
│ └── render.h
├── src/
│ ├── main.cpp
│ ├── game.cpp
│ ├── player.cpp
│ └── render.cpp
这份 CMakeLists.txt 在 Cxxdroid、CLion、VS Code、Linux 终端上都能直接用——你可以在手机上写好草稿,在桌面 IDE 上继续编译调试。
手动触发 CMake 配置
Cxxdroid 通常在你编译项目时自动调用 CMake。如果想手动配置,可以:
- 在菜单里找「Run CMake」或「Configure」选项
- 清理旧的 build 目录后重新编译会自动触发 CMake 重新配置
常见问题
find_package 找不到库
- 确认包管理器里真的装了那个库
- 有些库需要手动设置
CMAKE_MODULE_PATH指向 FindXXX.cmake 的位置 - 装完库后重启 Cxxdroid 可能刷新缓存
CMake 版本过低
- 有些项目要求 CMake 3.16 或更高
- Cxxdroid 内置的 CMake 版本取决于应用版本——新版 Cxxdroid 自带更新的 CMake
- 如果版本不够,可以尝试降低
cmake_minimum_required的要求(前提是项目本身没用到高版本特性)