马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、CMake概述
CMake(Cross-Platform Make)是一个跨平台的构建体系天生器,它天生平台的原生构建工具(如Makefile、Visual Studio工程、NinJa文件等),并支持复杂项目、多平台和多编译情况。
焦点功能
1、跨平台支持
2、管理复杂项目结构(子模块、依靠)
3、支持当代C++特性
4、集成第三方库
5、主动天生安装包
根本概念
1、CMakeLists.txt:每个目次的设置文件
2、目的(Target):可实行文件或库
3、变量(Variable):存储路径、选项、版本号等
4、天生器(Generator):决定天生哪种构建体系
5、作用域(Scope):变量和目的在差异的目次或函数中的可见性
二、CMake安装与版本管理
1、linux
sudo apt install cmake # Ubuntu/Debain
2、IOS
brew install cmake # MacOS
3、windows
choco install cmake #Chocolaty
4、查抄版本
cmake --version
三、根本结构
1、最小CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
add_executable(MyApp main.cpp)
2、根本下令
下令功能project()界说项目名称、语言和版本cmake_minimum_required(VERSION x.y)设置最低 CMake 版本add_executable( )添加可实行文件target_compile_options( )设置编译选项target_link_libraries( )链接库set( )设置变量message()输出信息四、变量与作用域
1. 设置变量
set(MY_VAR "Hello")
2.读取变量
message(${MY_VAR})
3.作用域
CACHE:跨目次可见
默认:仅在当前目次可见
PARENT_SCOPE:通报给父目次
eg:
set(MY_VAR "Hello" CACHE STRING "A cached variable")
五、目次与依靠管理
1、添加目次
add_executable(MyApp main.cpp)
add_library(MyLib STATIC lib.cpp)
2、目的属性
PRIVATE:仅当前目的
PUBLIC:当前目的 + 链接目的
INTERFACE:只作用于依靠目的
eg:
target_compile_definitions(MyLib PUBLIC USE_FEATURE_X)
target_include_directories(MyLib PUBLIC include)
target_link_libraries(MyApp PRIVATE MyLib)
六、目次结构与子目次
1.典范大型项目结构
MyProject/
├─ CMakeLists.txt
├─ src/
│ ├─ CMakeLists.txt
│ └─ main.cpp
├─ lib/
│ ├─ CMakeLists.txt
│ └─ mylib.cpp
├─ include/
│ └─ mylib.h
├─ tests/
│ └─ CMakeLists.txt
└─ third_party/
2.顶层 CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(MyProject)
add_subdirectory(lib)
add_subdirectory(src)
add_subdirectory(tests)
七、条件编译与选项
1.平台判断
if(WIN32)
message("Windows build")
elseif(UNIX)
message("Linux/Mac build")
endif()
2、选项开关
option(USE_FEATURE_X "Enable Feature X" ON)
if(USE_FEATURE_X)
add_definitions(-DUSE_FEATURE_X)
endif()
八、查找外部依靠
1.find_package
find_package(Boost 1.82 REQUIRED COMPONENTS filesystem)
target_link_libraries(MyApp PRIVATE Boost::filesystem)
2.FetchContent(下载源码)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.12.1
)
FetchContent_MakeAvailable(googletest)
九、自界说下令与目的
add_custom_command(
OUTPUT generated.cpp
COMMAND python generate.py
DEPENDS generate.py
)
add_executable(MyApp main.cpp generated.cpp)
add_custom_target:不天生文件,但可实行自界说利用。
十、安装与打包
1.安装文件
install(TARGETS MyApp DESTINATION bin)
install(FILES myconfig.conf DESTINATION etc)
`2.天生包(CPack)
include(CPack)
十一、测试集成
1.启用 CTest
enable_testing()
add_executable(test_app test.cpp)
add_test(NAME MyTest COMMAND test_app)
2.运行测试
ctest --output-on-failure
十二、天生与构建流程
1.天生构建体系
cmake -S . -B build -G "Visual Studio 17 2022"
2. 构建
cmake --build build --config Release -- -j8
十三、CMake 高级特性
1.INTERFACE 库:纯头文件库,无源码
add_library(MyHeaderLib INTERFACE)
target_include_directories(MyHeaderLib INTERFACE include/)
2.导出目的
install(TARGETS MyLib EXPORT MyLibTargets DESTINATION lib)
install(EXPORT MyLibTargets FILE MyLibTargets.cmake NAMESPACE MyLib:: DESTINATION lib/cmake)
3.工具链文件:交织编译设置
cmake -DCMAKE_TOOLCHAIN_FILE=arm_toolchain.cmake ..
4.天生器表达式
target_compile_definitions(MyApp PRIVATE "$")
十四、CMake最佳实践
1.利用 target_* 下令管理目的属性
2.制止全局变量污染
3.利用子目次管理大型项目
4.利用 CACHE 生存可设置选项
5.利用当代 CMake 提供的接口库(INTERFACE/PUBLIC/PRIVATE)
6.保持 CMakeLists.txt 轻便,每个目次只处置惩罚本身目的
7.优先利用 find_package 或 FetchContent 处置惩罚依靠
8.只管制止硬编码路径,利用 ${CMAKE_CURRENT_SOURCE_DIR} 等变量
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |