1、常用固定部分
- 最低 CMake 版本
- 项目名称和语言
- 编译选项(可选)
- 源文件与目标文件
- 依赖库
- 安装规则(可选)
- 测试(可选)
2、最小标准示例
cmake_minimum_required(VERSION 3.16) # 指定最低 CMake 版本
project(MyApp LANGUAGES CXX) # 工程名和语言
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # 禁止 gnu++ 扩展,强制标准 C++
# 源码
set(SOURCES
src/main.cpp
src/foo.cpp
src/foo.h
)
# 生成可执行文件
add_executable(${PROJECT_NAME} ${SOURCES})
# 链接库(示例)
# target_link_libraries(${PROJECT_NAME} PRIVATE pthread)
# 添加 include 路径
target_include_directories(${PROJECT_NAME}
PRIVATE
${PROJECT_SOURCE_DIR}/src
)
# 安装规则
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
3、带子目录和库
项目结构
MyProject/
├── CMakeLists.txt
├── src/
│ ├── CMakeLists.txt
│ ├── main.cpp
│ └── foo.cpp
│ └── foo.h
└── lib/
├── CMakeLists.txt
└── bar.cpp
└── bar.h
顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(MyProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加子目录
add_subdirectory(lib)
add_subdirectory(src)
src中的CMakeLists
set(SOURCES
main.cpp
foo.cpp
)
add_executable(MyApp ${SOURCES})
target_include_directories(MyApp PRIVATE ${PROJECT_SOURCE_DIR}/lib)
target_link_libraries(MyApp PRIVATE MyLib) # 依赖 lib 里的库
lib中的CMakeLists
set(LIB_SOURCES
bar.cpp
)
add_library(MyLib ${LIB_SOURCES})
target_include_directories(MyLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
注意:以Clion为例,如果修改了CMake文件或者添加了多个add_executable,生成不同的可执行文件,一定要reload重新加载CMake文件
add_library(MyApp #库文件
src/test.cpp
serc/test1.cpp
)
add_executable(demo1 src/apps/demo1.cpp) #添加可执行程序demo1
add_executable(demo2 src/apps/demo2.cpp) #添加可执行程序demo2
target_link_libraries(demo1 PRIVATE MyApp) #将demo1链接到MyApp库
target_link_libraries(demo2 PRIVATE MyApp) #将demo2链接到MyApp库