网站加栏目,润滑油东莞网站建设,琚宾设计公司官网,中国工商注册网官方网址一、Cmake 简介
cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。
本文供C软件开发者入门学习参考#xff0c;主要内容来自网络。
下载地址#xff1a;
Download CMake …一、Cmake 简介
cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。
本文供C软件开发者入门学习参考主要内容来自网络。
下载地址
Download CMake
windows下可以下载Windows x64 ZIP
当前最新版 4.0.3。
配置 CMake
确保 CMake 的安装路径被添加到系统的 PATH 环境变量中这样可以在任何位置的命令行中访问 CMake。 Windows 环境变量设置
如果在安装过程中选择了将 CMake 添加到 PATH则不需要额外配置。
如果未选择可以手动添加右键点击计算机或此电脑选择属性 - 高级系统设置 - 环境变量在系统变量中找到 Path点击编辑将 CMake 的安装路径添加进去。
macOS 和 Linux
通常安装程序会自动配置 PATH如果没有可以手动配置。
CMake GUI 使用
CMake 也提供了图形用户界面GUI可以用于更直观地配置项目。
在 Windows 中启动 cmake-gui.exe
二、CMake 基础
CMakeLists.txt 文件
CMakeLists.txt 是 CMake 的配置文件用于定义项目的构建规则、依赖关系、编译选项等。
每个 CMake 项目通常都有一个或多个 CMakeLists.txt 文件。
简单示例如下 #最低支持的CMAKE版本 cmake_minimum_required(VERSION 3.31.0) set(CMAKE_C_COMPILER C:/Qt/Tools/mingw1310_64/bin/gcc.exe) set(CMAKE_CXX_COMPILER C:/Qt/Tools/mingw1310_64/bin/g.exe) set(projectName hello) #项目名字 project(${projectName}) #设置C标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) #自动检查系统中可用的C编辑器, 我已经在系统中安装了MSVC #将该目录下所有的源文件都关联起来 aux_source_directory(Demo.cpp CPP_LIST) #生成一个名叫MyProject.exe的可执行文件 add_executable(${projectName} ${CPP_LIST}) 文件结构和基本语法
CMakeLists.txt 文件使用一系列的 CMake 指令来描述构建过程。常见的指令包括 1、指定 CMake 的最低版本要求
cmake_minimum_required(VERSION version)
例如
cmake_minimum_required(VERSION 3.10)
2、定义项目的名称和使用的编程语言
project(project_name [language...])
例如
project(MyProject CXX)
3、指定要生成的可执行文件和其源文件
add_executable(target source_files...)
例如
add_executable(MyExecutable main.cpp other_file.cpp)
4、创建一个库静态库或动态库及其源文件
add_library(target source_files...)
例如
add_library(MyLibrary STATIC library.cpp)
5、链接目标文件与其他库
target_link_libraries(target libraries...)
例如
target_link_libraries(MyExecutable MyLibrary)
6、添加头文件搜索路径
include_directories(dirs...)
例如
include_directories(${PROJECT_SOURCE_DIR}/include)
7、设置变量的值
set(variable value...)
例如
set(CMAKE_CXX_STANDARD 11)
8、设置目标属性
target_include_directories(TARGET target_name[BEFORE | AFTER][SYSTEM] [PUBLIC | PRIVATE | INTERFACE][items1...])
例如
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)
9、安装规则
install(TARGETS target1 [target2 ...][RUNTIME DESTINATION dir][LIBRARY DESTINATION dir][ARCHIVE DESTINATION dir][INCLUDES DESTINATION [dir ...]][PRIVATE_HEADER DESTINATION dir][PUBLIC_HEADER DESTINATION dir])
例如
install(TARGETS MyExecutable RUNTIME DESTINATION bin)
10、条件语句 (if, elseif, else, endif 命令)
if(expression)# Commands
elseif(expression)# Commands
else()# Commands
endif()
例如
if(CMAKE_BUILD_TYPE STREQUAL Debug)message(Debug build)
endif()
11、自定义命令 (add_custom_command 命令)
add_custom_command(TARGET targetPRE_BUILD | PRE_LINK | POST_BUILDCOMMAND command1 [ARGS] [WORKING_DIRECTORY dir][COMMAND command2 [ARGS]][DEPENDS [depend1 [depend2 ...]]][COMMENT comment][VERBATIM]
)
例如
add_custom_command(TARGET MyExecutable POST_BUILDCOMMAND ${CMAKE_COMMAND} -E echo Build completed.
)
变量和缓存
CMake 使用变量来存储和传递信息这些变量可以在 CMakeLists.txt 文件中定义和使用。
变量可以分为普通变量和缓存变量。
变量定义与使用
定义变量
set(MY_VAR Hello World)
使用变量
message(STATUS Variable MY_VAR is ${MY_VAR})
缓存变量
缓存变量存储在 CMake 的缓存文件中用户可以在 CMake 配置时修改这些值。缓存变量通常用于用户输入的设置例如编译选项和路径。
定义缓存变量
set(MY_CACHE_VAR DefaultValue CACHE STRING A cache variable)
使用缓存变量
message(STATUS Cache variable MY_CACHE_VAR is ${MY_CACHE_VAR}) 查找库和包
CMake 可以通过 find_package() 指令自动检测和配置外部库和包。
常用于查找系统安装的库或第三方库。
find_package() 指令
基本用法
find_package(Boost REQUIRED)
指定版本
find_package(Boost 1.70 REQUIRED)
查找库并指定路径
find_package(OpenCV REQUIRED PATHS /path/to/opencv)
使用查找到的库
target_link_libraries(MyExecutable Boost::Boost)
设置包含目录和链接目录
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
使用第三方库
假设你想在项目中使用 Boost 库CMakeLists.txt 文件可能如下所示
实例
cmake_minimum_required(VERSION 3.10) project(MyProject CXX) # 查找 Boost 库 find_package(Boost REQUIRED) # 添加源文件 add_executable(MyExecutable main.cpp) # 链接 Boost 库 target_link_libraries(MyExecutable Boost::Boost)
include_directories() 和 target_include_directories()
在 CMake 中include_directories() 和 target_include_directories() 都用于指定头文件的搜索路径但它们的作用范围和使用方式有显著区别。
相同点
两者都用于添加头文件的搜索路径编译器会在这些路径中查找 #include 指令中指定的头文件。两者都支持绝对路径和相对路径相对路径是相对于当前 CMakeLists.txt 文件所在的目录。两者都可以用于指定公共头文件路径PUBLIC、私有头文件路径PRIVATE或接口头文件路径INTERFACE。
区别
特性include_directories()target_include_directories()作用范围全局作用域影响所有目标target。仅作用于指定的目标target。推荐使用场景适用于简单的项目或旧版 CMake 项目。适用于现代 CMake 项目推荐优先使用。目标关联性不直接关联到特定目标可能影响所有目标。显式关联到特定目标避免污染其他目标。可维护性较差容易导致全局路径污染。较好路径与目标绑定逻辑清晰。作用域控制无法精确控制路径的作用范围。可以通过 PUBLIC、PRIVATE、INTERFACE 精确控制路径的作用范围。现代 CMake 推荐不推荐使用除非有特殊需求。推荐使用符合现代 CMake 的最佳实践。 三、CMake 构建流程
CMake 的构建流程分为几个主要步骤从设置项目到生成和执行构建命令。
创建构建目录保持源代码目录整洁。使用 CMake 生成构建文件配置项目并生成适合平台的构建文件。编译和构建使用生成的构建文件执行编译和构建。清理构建文件删除中间文件和目标文件。重新配置和构建处理项目设置的更改。 四、参考资料
CMake 基础 | 菜鸟教程
CMakeLists.txt 语法介绍与实例演练_android cmakelists.txt可以写多个吗-CSDN博客