首页 > 其他分享 >CMake使用

CMake使用

时间:2024-11-06 15:20:38浏览次数:1  
标签:PROJECT cmake target MathFunc 使用 test CMake include

可见性修饰符和目标

cmake中有三种可见性修饰符:PRIVATEPUBLICINTERFACE

这些修饰符随着命令一起使用,如target_include_directoriestarget_link_libraries
这些修饰符是在目标targets的上下文中指定的

目标targets是指在cmake中某种类型的输出:

  • 可执行目标add_executable生成二进制可执行文件
  • 库目标add_library生成库文件
  • 自定义目标add_custom_target通过脚本生成任意文件

接口目标是库目标的一个特殊情况,定义如下:

add_library(my_interface_lib INTERFACE)
target_include_directories(my_interface_lib INTERFACE include/)

里my_interface_lib不会立即生成任何文件,但后面可能有依赖它的具体目标
INTERFACE库可以被看作是构建依赖关系的一种便利机制

target_include_directories(test PRIVATE "${CMAKE_BINARY_DIR}")
表示目标test将使用指定的包含目录
但若后面有其他目标链接到test,则不会依赖于该目录
即源文件和依赖关系只传递给当前目标

target_include_directories(test PUBLIC "${CMAKE_BINARY_DIR}")
表示目标test将使用指定的包含目录
且若后面有其他目标链接到test,也会依赖该包含目录
即源文件和依赖关系传递给当前目标及依赖它的目标

target_include_directories(test INTERFACE "${CMAKE_BINARY_DIR}")
表示目标test本身不需要该包含目录
但若后面有其他目标链接到test,则会依赖于该包含目录
即源文件和依赖关系不传递给当前目标,但会传递给依赖它的目标

cmake中可以用子目录指定独立的模块及其自定义构建流程
可以由一个主cmake配置触发多个目录的构建,最后再链接到主程序
如下目录结构

test
  MathFunc
    mysqrt.hpp
    mysqrt.cpp
    MathFunc.hpp
    MathFunc.cpp
    CMakeLists.txt
  test.cpp
  CMakeLists.txt

库文件的使用

需要找到库文件和对应的头文件

  1. 添加库文件
target_link_libraries()
  1. 添加头文件的两种方法
    INCLUDE_DIRECTORIES全局性引入
    target_include_directories可以为当前目标文件指定头文件路径

  2. 使用更现代化的方法来包含库文件
    如链接MathFunc库的目标文件都需要包含MathFunc目录作为头文件路径
    若在MathFunc/CMakeLists.txt中添加

target_include_directories(
  MathFunc
  INTERFACE
  ${CMAKE_CURRENT_SOURCE_DIR}
)

指定了INTERFACE修饰,则项目的CMakeLists.txt可以不使用EXTRA_INCLUDE变量
只要链接MathFunc库,就会自动包含库所在目录的头文件
注意:静态库被不同程序引用,内存在会存在静态库函数的多份拷贝

生成可执行文件

add_executabe()

若有多个源文件,用空格隔开,可以用${PROJECT_NAME}引用项目名

用一个变量来表示多个源文件

set(SRC_LIST a.cpp b.cpp c.cpp)

引用变量的方式${}

添加编译时间戳

string(TIMESTAMP COMPILE_TIME %Y%m%d-%H%M%S)

Config.h.in中添加#define TIMESTAMP @COMPILE_TIME@

指定C++标准

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_executable命令之前添加,GCC6.1开始,默认为C++14

将库文件设置为可选项

  1. 经典方法
    提供用户可选项option(USE_MATHFUNC "description" ON)
    将库的构建和链接添加条件
if(USE_MATHFUNC)
  add_subdirectory(MathFunc)
  list(APPEND EXTRA_LIBS MathFunc)
  list(APPEND EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/MathFunc)
endif()

target_link_libraries(
  ${PROJECT_NAME}
  PUBLIC
  ${EXTRA_LIBS}
)
target_include_directories(
  ${PROJECT_NAME}
  PUBLIC
  ${PROJECT_BINARY_DIR}
  ${EXTRA_INCLUDES}
)

变量EXTRA_LIBS保存需要链接到可执行程序的可选库
变量EXTRA_INCLUDES保存可选的头文件的搜索路径

  1. 现代方法
    修改源代码
#ifdef USE_MATHFUNC
  #include"MathFunc.hpp"
#endif

#ifdef USE_MATHFUNC
  const double val= mysqrt(inputVal);
#else
  const double val= std::sqrt(inputVal);
#endif

由于是引用的cmake中的变量,需要在Config.h.in中添加

#cmakedefine USE_MATHFUNC

也可以在构建时指定变量值

cmake -DUSE_MATHFUNC=OFF ..
cmake --build .

安装规则

install(
  TARGETS target1 [target2 ...]
  [RUNTIME DESTINATION dir]
  [LIBRARY DESTINATION dir]
  [ARCHIVE DESTINATION dir]
  [INCLUDES DESTINATION [dir ...]]
  [PRIVATE_HEADER DESTINATION dir]
  [PUBLIC_HEADER DESTINATION dir]
)

在C++项目中使用cmake中的变量

cmake通过config.h.in提供的机制,允许在cpp文件中使用CMakeLists.txt中的变量

编写文件Config.h.in

#pragma once
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define AUTHOR_NAME "@AUTHOR_NAME@"

在CMakeLists.txt中配置

cmake_minimum_required(VERSION 3.10)
project(tuto)

set(PROJECT_VERSION_MAJOR 1)
set(PROJECT_VERSION_MINOR 0)
set(AUTHOR_NAME "Jith")

configure_file(Config.h.in Config.h)

add_executable(tuto tuto.cpp)

# include the dir where the generated header file is located
target_include_directories(tuto PRIVATE "${CMAKE_BINARY_DIR}")

Config.h会自动写入到build目录
需要将该目录添加到搜索头文件的路径列表,也可以修改为写到其它目录
${CMAKE_BINARY_DIR}表示当前工程的二进制路径,存放编译生成,即build目录

cmake会在变量占位被填充后生成头文件,这些动态生成的头文件需要被包含到项目中
示例中Config.h文件被放置在${CMAKE_BINARY_DIR}目录中,所以只需要指定该路径即可

标签:PROJECT,cmake,target,MathFunc,使用,test,CMake,include
From: https://www.cnblogs.com/sgqmax/p/18530287

相关文章

  • Cmake 实操 -- 使用文件操作命令添加源码文件并移除失效问题记录
    搜索文件使用file(GLOB_RECURSEfileListsearchDir/*.cpp)搜索searchDir目录下所有cpp文件,将路径保存到fileList中。GLOB_RECURSE:启用递归搜索。ps:searchDir不会被展开,如果searchDir中存在C/test/../test1,保存到fileList中的文件路径将仍然带有C/test/../test1,而不是C/test1......
  • Air780E的I2C软件使用指南
    ​ 今天我们学习合宙低功耗4G模组Air780E的I2C接口操作方法,文末【阅读原文】获取最新资料。一、I2C概述Air780E可支持1路I2C接口,如果复用的话最多有两路: ​I2C配置:兼容PhilipsI2C标准协议。支持Fastmode(400Kbps)和Slowmode(100Kbps)。只支持master模式,不支持slaver模式......
  • Redis使用IO多路复用进行事件处理机制
    一、epoll多路复用这里重点要说的就是redis的IO编程模型,首先了解下为什么要有多路复用呢?案例引用知乎上一个高赞的回答来解释什么是I/O多路复用。假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C......
  • 使用双指针技术去除ArrayList中的重复元素
    技术博客:使用双指针技术去除ArrayList中的重复元素在Java编程中,处理集合数据时,去除重复元素是一个常见的需求。本文将介绍如何使用双指针技术来高效地去除ArrayList中的重复元素,并通过两种不同的方法进行实现。1.问题背景假设我们有一个包含重复元素的ArrayList,例如:ArrayL......
  • 《仙剑客栈2》游戏辅助工具全面操作手册与使用技巧详解
    《仙剑客栈2》是一款结合了模拟经营和角色扮演元素的游戏,玩家在游戏中需要管理一家客栈,同时还要处理各种冒险和故事情节。风灵月影团队制作的修改器可以帮助玩家在游戏中获得更多的便利和乐趣。以下是一个全面的操作手册和使用技巧详解,帮助你更好地使用这款修改器。修改器功能......
  • 图像重建Restormer介绍与使用
    文章目录前言一、Restormer介绍二、环境安装与配置三、代码使用与效果前言图像恢复是计算机视觉领域中的一个重要研究方向,它旨在通过算法修复损坏、模糊或缺失的图像信息,从而恢复图像的原始质量。随着图像处理技术的不断发展,图像恢复在许多领域都发挥着重要作用,如医......
  • 微信小程序使用Promise异步请求
     在微信小程序中,如果你希望在一个HTTP请求完成后再继续执行下面的代码,可以将后续代码放入请求的回调函数中。如果不想使用嵌套的回调函数,可以考虑使用 Promise 来处理异步请求。这样可以更清晰地组织代码,还能避免“回调地狱”的问题。这是原方法并不会在执行完http请求后......
  • 一文带您了解SonarScanner的原理和使用方法(包括maven构建和命令行执行)
    SonarScanner扫描代码SonarScanner执行源代码分析。这个独立的程序在CI/CD主机上运行,并将分析结果发送到SonarQube服务器,由其计算分析结果,计算质量门并生成报告。为了执行分析,SonarScanner使用安装时从SonarQube服务器下载的语言分析器。SonarScanner和SonarQube二者的关系,通......
  • 华为云开源时序数据库openGemini:使用列存引擎解决时序高基数问题
    摘要:openGemini通过引入新的数据排序与索引方式,开发了全新列存引擎,以解决海量时间线场景对于现有时序数据管理方案带来的问题。本文来源:《华为云DTSE》第五期开源专刊,作者:向宇,华为云数据库高级研发工程师、黄飞腾,博士,openGemini存储引擎架构师在时序数据场景中,大部分的解......
  • 如何使用 GoPro 进行视频直播 All In One
    如何使用GoPro进行视频直播AllInOneWebCam/网络摄像头支持视频直播的产品和应用GoProHERO7Black及更高版本GoProQuik应用(必需)https://community.gopro.com/s/article/How-To-Live-Stream-From-Your-GoPro?language=zh_CNdemos2024年美国总统大选......