开源项目学习(6)---- CMake 可执行文件生成

2024-06-10 13:28

本文主要是介绍开源项目学习(6)---- CMake 可执行文件生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CMake 基础DEMO

标题

    • CMake 基础DEMO
      • 可执行文件的生成
        • 最简单的可执行文件实例
        • 使用变量定义生成目标
        • 添加宏定义
        • 设置可执行文件的路径
        • 自动寻找依赖库
      • 打印信息
      • CMake 常见编译选项

可执行文件的生成

最简单的可执行文件实例
cmake_minimum_required(VERSION 3.22)
project(tonydemoproject)add_executable(testdemo main.cpp)

如果要添加多个文件到可执行文件中:

cmake_minimum_required(VERSION 3.22)
project(tonydemoproject)add_executable(testdemo main.cpp basicStringDemo.cpp basicStringDemo.h)
使用变量定义生成目标

也可以使用变量的方法定义:

file( GLOB APP_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp )
message(Info "CMAKE_CURRENT_SOURCE_DIR is ${CMAKE_CURRENT_SOURCE_DIR}")
message(Info "APP_SOURCES is ${APP_SOURCES}")
add_executable(testdemo ${APP_SOURCES})

输出结果如下:

InfoCMAKE_CURRENT_SOURCE_DIR is /home/tonychen/Documents/visualstudiocode_demo
InfoAPP_SOURCES is basicStringDemo.cpp;cplusCastDemo.cpp;main.cpp
-- Configuring done
-- Generating done
-- Build files have been written to: /home/tonychen/Documents/visualstudiocode_demo/cmake_build

上面的 message 用于打印出信息,第一个参数的含义如下:

() = 重要消息;STATUS = 非重要消息;WARNING = CMake 警告, 会继续执行;AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;FATAL_ERROR = CMake 错误, 终止所有处理过程;
添加宏定义
......
add_definitions(-DTDEBUG)
add_executable(testdemo ${APP_SOURCES})

上面的 CMakeLists.txt 中就会自动添加 TDEBUG的宏

设置可执行文件的路径

设置可执行文件输出目录的方法如下:

.....set (EXECUTABLE_OUTPUT_PATH ./bin/)
add_definitions(-DTDEBUG)
add_executable(testdemo ${APP_SOURCES})

编译时就会看到可执行文件的路径变化:
Consolidate compiler generated dependencies of target testdemo
[ 25%] Building CXX object CMakeFiles/testdemo.dir/main.cpp.o
[ 50%] Linking CXX executable bin/testdemo
[100%] Built target testdemo

自动寻找依赖库

cmake 提供了一个通过 类unix 系统都有的 pkg-config 命令自动查找依赖的库和对应头文件的操作,看实例如下:

cmake_minimum_required(VERSION 3.21)
project(basicc_demo C)set(CMAKE_C_STANDARD 11)find_package(PkgConfig REQUIRED)
pkg_search_module(EGL REQUIRED egl)
pkg_search_module(GLESv2 REQUIRED glesv2)# 假设EGL_FOUND 打印出具体的 EGL 和 GLESv2 的信息
if(EGL_FOUND)
MESSAGE(WARNING "Found Packages EGL")
MESSAGE(WARNING "print ${EGL_INCLUDE_DIRS}")
MESSAGE(WARNING "print ${GLESv2_LIBRARIES}")
endif()add_executable(basicc_demo main.ctestbasicCOperator.htestbasicCOperator.ctestbasicPointer.ctestbasicPointer.hccommon.hbasicCVector.cbasicCVector.h)

pkg_search_module( REQUIRED|QUIET [ ])
pkg_search_module 这个函数中,参数意义如下:

<prefix>: 这是一个变量前缀,CMake 会创建一些变量来表示找到模块的信息,这些信息会以这个前缀作为开头,
比如前缀是 FOO,那么可能会创建变量 FOO_FOUND,FOO_INCLUDE_DIRS FOO_LIBRARIES
REQUIRED 或 QUIET:
REQUIRED 表示这个模块是必须找到的,如果找不到,CMake 将会停止配置过程并报错。
QUIET 表示如果找不到模块,CMake 不会发出警告或错误,配置过程会继续。
<name>: 这是你要查找的模块的名称,通常是 pkg-config 的模块名称。

打印信息

在 CMake 中,message() 函数用于在构建过程中输出信息性、警告性或错误性的消息,基本的使用方法如下:

message([<mode>] "message to display" ...)

mode 是可选参数,如果不提供,默认是 STATUS 类型,mode 的可选参数如下:
STATUS: 表示一条状态消息,这是默认模式
SEND_ERROR: 表示一条错误消息,这会导致 CMake 继续处理,但最终配置步骤会失败
FATAL_ERROR: 表示一条致命错误消息,CMake 会立即停止处
WARNING: 表示一条警告消息,CMake 会继续处理
AUTHOR_WARNING: 表示一条仅对项目作者可见的警告消息,类似于 WARNING,但不会警告最终用户

CMake 常见编译选项

下面是一些常用的 CMake 编译选项,以及经过验证:

  1. -DCMAKE_BUILD_TYPE: 设置构建类型,如 DebugReleaseRelWithDebInfoMinSizeRel

  2. -DVAR=value: 定义一个变量及其值,可以在 CMakeLists.txt 中使用该变量

  3. -H -S: 指定源代码目录,两者的含义相同

  4. -B: 指定生成构建系统文件的目录,与 -S 选项结合使用 比如:
    cmake -S /xxxx/src -B ./cmake_build_dir

  5. -D<CMAKE_VARIABLE>=<value>: 设置 CMake 内置变量的值,如 CMAKE_C_COMPILERCMAKE_CXX_COMPILER

  6. --build pathtobuild 在生成编译系统文件的基础上进行编译,路径和 -B 选项生成的一致,此命令会进行编译操作

tonychen@tonychen-PC:~/CLionProjects/basicc_demo$ cmake --build ./cmake-build-debug/
Consolidate compiler generated dependencies of target basicc_demo
[100%] Built target basicc_demo
  1. --target xxx 制定生成的目标,通常和 --build 选项配合使用,注意这里的目标要和 CMakeLists.txt 中的保持一致,此命令用于 CMakeLists.txt 包含多目标的情形

  2. -DCMAKE_INSTALL_PREFIX 设置安装的路径前缀
    cmake -DCMAKE_INSTALL_PREFIX=/path/to/install

9.-DBUILD_SHARED_LIBS=ON: 默认构建共享库(动态库)

  1. -DBUILD_STATIC_LIBS=ON: 构建静态库
    cmake -DBUILD_STATIC_LIBS=ON

这篇关于开源项目学习(6)---- CMake 可执行文件生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048284

相关文章

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2