cmake Targets:CMake如何构建简单的Target

2023-11-20

CMake有三个基本命令,用于定义CMake Target,分别是:

  • add_executable()                                // 构建exe
  • add_library()                                       // 构建库
  • add_custom_target()                         // 自定义构建目标在camke构建阶段运行的

add_executable()

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                [EXCLUDE_FROM_ALL]
                [source1] [source2 ...])

尖括号是必须要填的方括号是表示可选的.

该命令用于定义一个可以构建可执行程序的Target.

第一个参数是Target的名字,这个参数必须提供.

第二个参数WIN32是可选的参数,Windows平台特定的参数.

第三个参数MACOSX_BUNDLE跟第二个参数类似是Mac平台特有的参数.

第四个参数EXCLUDE_FROM_ALL如果存在,那CMake默认构建的时候是不会构建这个Target.

后续source1等等,可选参数均为该构建可执行文件所需的源码.

例如:

add_executable(Tutoral ${CMAE_CURRENT_SOURCE_DIR}main/main.cpp)

我构建了一个Tutoral可执行文件,使用的源码是这个路径下的${CMAE_CURRENT_SOURCE_DIR}main/main.cpp 源码

${CMAE_CURRENT_SOURCE_DIR} 这个参数是当前cmake文件的路径.

add_library()

 add_library(<name> [STATIC | SHARED | MODULE]
             [EXCLUDE_FROM_ALL]
             [<source>...])

和add_executable()非常相似,该命令用于构建成库文件的Target.

add_library()命令支持可选的三个互斥参数: STATIC | SHARED | MODULE.这三个参数要么都不写,要么只写一个.这个三个参数的意思是STATIC(静态库),SHARED(动态库),MODULE(类似于动态库,不过不会被其他库或者可执行程序链接,用于插件式框架的软件的插件构建)

当然最佳的实践是不要自己在CMakeLists.txt中指定这几个参数,而是把主动权交给构建者,通过cmake -DBUILD_SHARED_LIBS=YES 的形式告诉其需要构建那种库.

add_custom_target()

add_custom_target(Name [ALL] [command1 [args1...]]
                   [COMMAND command2 [args2...] ...]
                   [DEPENDS depend depend depend ... ]
                   [BYPRODUCTS [files...]]
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment]
                   [JOB_POOL job_pool]
                   [VERBATIM] [USES_TERMINAL]
                   [COMMAND_EXPAND_LISTS]
                   [SOURCES src1 [src2...]])

关于Target链接

Target之间在构建的时候可能会出现A依赖B,B依赖C等情况.一般这种依赖都是因为某个Target需要链接另外一个Target.用C++的知识来说就是编译器在链接阶段需要的库.

在CMake中我们使用target_link_libraries()命令来实现这一点.

target_link_libraries(<targetName> <PRIVATE | PUBLIC | INTERFACE> ... <item>... ...)

第一个参数必须指定,改名字由add_executable()或者add_libraries()命令创建的Target的名字.

后续可以接多个PRIVATE,PUBLIC,INTERFACE选项,这三个选项类似于C++类定义的private,public,protect.

这三个选项后面跟着iterms 一般是一些类库的名字,这些库由add_libraries()命令创建的Target的名字.也可以是其他方式引入的库的名字.

PRIVATE选项的含义是:targetName这个target会链接PRIVATE选项后的iterms指定的这些库,这些库只有targetName这个Target本身需要,其他任何链接这个target的其他Target都不知道这些iterms的存在.

PUBLIC选项的含义:不止targetName本身这个Target需要这些iterms,其他链接到targetName的Target也需要依赖这些iterms并链接这些iterms.

INTERFACE选项的含义:targetName本身不需要这些iterms,但是其他链接targetName的Target需要依赖这些iterms,并链接这些iterms.

最佳实践

  • 不要将Target的名字设置为${projectName}
  • 给库命名的时候避免lib前缀
  • 如果没有足够的理由,在定义库目标的时候不要使用STATIC或SHARED关键字,控制权应该交给构建时的开发者(BUILD_SHARED_LIBS)
  • target_link_libraries()总是指明PROIVATE,PUBLIC,INTERFACE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake Targets:CMake如何构建简单的Target 的相关文章

随机推荐

  • 使用windeployqt与inno setup实现windows下Qt程序发布打包

    一 使用windeployqt拷贝依赖文件 在发布生成的exe程序时 需要复制一大堆dll 如果自己去复制dll 很可能丢三落四 导致exe在别的电脑里无法正常运行 因此Qt官方开发环境里自带了一个工具 windeployqt exe 1
  • HR 宏

    表TRMAC 程序DBPNPMAC 转载于 https www cnblogs com CtrlS p 10818285 html
  • Tableau 中的组(group)与集(set)

    使用tableau也好长时间了 最近有同事问我tableau中组和集有什么区别 那今天就谈谈我个人对组和集的一些理解 也算是一个回顾 理解不对之处还望大牛们及时指正 1 首先看看官方的定义 组是构成更高级别类别的维度成员的组合 单独理解的确
  • Error:(923) Apostrophe not preceded by \ (in %1$s's )

    问题描述 在使用Android的strings xml时 英文版会遇到许多简写 其中 s 和 t时经常使用的 如果直接使用编译无法通过就报标题所示错误 解决方法 主要原因是 是特殊字符 需要转义 加 既可解决 示例 xx s thing 修
  • VMware 中搭建 SylixOS 环境

    1 制作 x86 平台 U 盘启动盘 详细步骤见 RealEvo IDE 使用手册 第八章 制作成功后插入 U 盘 2 创建 VMware 虚拟机设备 打开 VMware 这里使用版本为 15 5 6 点击 创建新的虚拟机 按如下步骤创建虚
  • linux 如何查看进程端口号,在linux中查看进程占用的端口号

    在Linux 上的 etc services 文件可以查看到更多关于保留端口的信息 可以使用以下六种方法查看端口信息 ss 可以用于转储套接字统计信息 netstat 可以显示打开的套接字列表 lsof 可以列出打开的文件 nmap 是网络
  • srand(time(NULL))

    srand函数是随机数发生器的初始化函数 原型 void srand unsigned seed 用法 它初始化随机种子 会提供一个种子 这个种子会对应一个随机数 如果使用相同的种子后面的rand 函数会出现一样的随机数 如 srand 1
  • 什么是页面文件使用率

    你好 很高兴能看到你的问题 也很高兴我能够回答你的问题 你提问 什么是页面文件使用率 首先我们必须要了解什么叫 页面文件 页面文件是一个存放在硬盘上的文件 大多数情况下都放在系统磁盘 如C 盘 的根目录下 这个文件不允许用户访问 只能够被操
  • 简单的文件内容繁简体甄别

    在做国际化的时候 很多旧文件中的简体或者繁体 需要优化 一个一个找很麻烦 于是在查阅资料后 自己编写了一个简单的工具 废话不多说 上码子 插件 mui ui vue js jquery 項目是 hbuildx 直接創建的 change la
  • pip相关命令

    查看当前pip源 pip config list 更改pip源 pip config set global index url 清华源网址 升级pip python m pip install upgrade pip 安装模块 pip in
  • vue3中路由的使用

    路由是什么 vue中的路由是用来管理页面切换或跳转的一种方式 Vue Router是vue官方的路由管理器 1 Vue Router的安装 需要先弄好npm npm install vue router 4 s 在安装完成之后 开始尝试简单
  • BT蓝牙协议 — HFP/HSP的关联与区别

    一 前言 有时 我们能看到有的蓝牙产品标明支持HFP HSP 而有的产品却只标注了支持HFP 那么HFP or HSP是什么呢 又有什么样的关系呢 二 HSP协议 HSP Headset Profile 耳机模式 仅实现了最基本的通话操作
  • c语言判断一个数是否为偶数

    include
  • 图解五种磁盘调度算法, FCFS, SSTF, SCAN, C-SCAN, LOOK

    一 FCFS 调度 先来先服务 磁盘调度的最简单形式当然是先来先服务 FCFS 算法 虽然这种算法比较公平 但是它通常并不提供最快的服务 例如 考虑一个磁盘队列 其 I O 请求块的柱面的顺序如下 98 183 37 122 14 124
  • 华为OD机试 Python 【TLV解析】

    题目 题目简述 你收到了一串由两端设备传递的TLV格式的消息 现在你需要根据这串消息生成一个对应的 tag length valueOffset 列表 详细说明 这串消息其实是由许多小组成的 每一小组里包含了tag length value
  • win可以上网,但是右下方显示“无internet链接“

    使用了下面链接的方法 成功解决 Win10可以联网但右下角显示无法连接到Internet怎办 首先 打开控制面板 control 右上角 将查看方式切换为小图标 调整计算机的设置下 找到并点击网络和共享中心 网络和共享中心窗口 左侧点击更改
  • 苹果鼠标win10不能滑动_解决WIN10使用苹果鼠标滚轮不能使用的问题

    这个花费了蛮多时间却解决不了 网上流行各种各样的尝试 还有很多的安装包 都试了一遍 无一解决 绝望的时候 看到有个网友发的云盘链接 感谢 花小柏 一安装即可使用 太感谢了 最后也分享给大家 链接 https pan baidu com s
  • Linux运维脚本

    20200911 这里记录一些平时使用的脚本 免密登陆什么的 免密登陆 bin bash f root ssh id rsa pub ssh keygen t rsa P f root ssh id rsa gt dev null expe
  • 【2023版】最新stable diffusion安装教程,一键安装,永久使用,stable diffusion下载安装教程!

    关于现在非常红火的AI绘画 很多感兴趣的人不知道如何入手 如果你的电脑配置足够好 那么不要犹豫 让我来教你如何在本地电脑全免费运行当下最强大的AI绘画工具 Stable Diffusion 吧 一 Stable Diffusion 是什么
  • cmake Targets:CMake如何构建简单的Target

    CMake有三个基本命令 用于定义CMake Target 分别是 add executable 构建exe add library 构建库 add custom target 自定义构建目标在camke构建阶段运行的 add execut