CMake“项目”指令的正确用法是什么

2024-05-18

我有一个很大的代码库,它构建了几十个库和几个可执行文件。

代码库按层次结构进行分解,并且几乎在每个级别都构建了库。

我已经仔细检查并在每个目录中放置了一个 CMakeLists.txt 文件来构建每个库。

在每个 CMakeLists.txt 中,我都使用了“project( xxx )”指令。这为我定义了 PROJECT_NAME、PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 变量,我明智地使用了这些变量。

然而,团队中的一个人对这种方法并不满意,因为他找不到任何其他人这样做的现实例子。他经常引用 KitWare 的例子来说明没有使用这种方法,因此我们也不应该这样做。

他提倡的另一种方法是在每个 makefile 中设置这些变量,这看起来很像“项目”为您提供的内容。

我真的不明白他的观点,并且在说服他否则方面没有取得什么进展。任何人都可以阐明以这种方式使用项目指令的缺点吗?

我全心全意依靠你们的集体智慧?


首先,它使您能够使用<projectName>_BINARY_DIR and <projectName>_SOURCE_DIR,但这不是主要优势。如果您给 CMake 一个项目名称,那么它将为每个子项目在其自己的目录中生成构建目标。这意味着无论您使用 GNU Make、Eclipse CDT、XCode 还是任何其他受支持的生成器,您都可以单独构建子项目。例如,使用 GNU Make,每个子项目都有来自其自己目录的完整构建系统。

您可以通过以下方式访问当前项目名称PROJECT_NAME,以及根项目名称CMAKE_PROJECT_NAME.

编辑:我刚刚意识到以下内容将是其任何构建目标的标准 CMake 行为,无论它们是否是项目。我将其保留在这里作为一般信息,但它与答案无关:

假设我有一个 C++ 库,并且我可以生成三个二进制可执行文件;Main and tests/test1, and examples/ex1。我可以在我调用 CMake 的目录中使用 ALL 目标运行 make,运行make ex1,或者我可以将目录更改为examples/并构建示例make从该目录。这将构建所有依赖的项目和库,即使它们位于目录结构中的其他位置,但不会构建Main or tests/test1或它们依赖的任何库examples/ex1没有。如果我然后从主目录运行 make,它不会重建任何库examples/ex1取决于除非它们的来源发生了变化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake“项目”指令的正确用法是什么 的相关文章

随机推荐

  • 如何实时改变setInterval的速度

    我想知道如何实时更改 setInterval 的速度 例如 if score lt 10 repeater setInterval function spawnEnemy 1000 if score gt 10 repeater setIn
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • 使用 LINQ 通过一个属性比较两个列表

    假设我有以下内容 class Widget1 public int TypeID get set public string Color get set class Widget2 public int TypeID get set pub
  • 将两个表合并为一个输出

    假设我有两张表 已知营业时间 ChargeNum CategoryID Month Hours 111111 1 2 1 09 10 111111 1 3 1 09 30 111111 1 4 1 09 50 222222 1 3 1 09
  • JQuery Datepicker OnSelect 和 TextChanged 问题

    自从将 OnSelect 添加到我的 Datepicker 后 该控件不再触发 TextChanged 事件 我的代码如下 function datepicker minDate 0 dateFormat dd M yy onSelect
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • Pandas Groupby:如何使用两个 lambda 函数?

    我目前可以在 Pandas 中执行以下操作 但 FutureWarning 严厉地摇动着我的手指 grpd df groupby rank agg mean np mean meian np median min np min max np
  • 检测非聚焦窗口上的鼠标滚轮?

    我的目标是制作一个浮动工具栏 作为其自己的 C 应用程序 当用户在我上方使用滚轮时 我想更改可见的按钮 听起来很简单 应该只是这句话的问题 MouseWheel new MouseEventHandler Form1 MouseWheel
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • 在 Django 模板中使用 forloop.counter 值作为列表索引

    在我的 Django 1 1 1 应用程序中 我在视图中有一个函数 它向模板返回一系列数字和项目列表列表 例如 data item1 item2 item3 item4 item5 item6 item7 item8 item9 retur
  • DateTimePicker默认值:如何避免?

    Facts 我有一个带有 2 个选项卡的 TabControl 每个选项卡有 2 个 DateTimePicker 在 Load 事件中 我设置了所有 DTP 的值 所有 DTP 都将 ShowCheckBoxes 设置为 true 并将
  • Weld 中的 JavaEE CDI:通用事件?

    我有一个基于泛型的特定事件处理的想法 但似乎 Weld 无法处理它们 我询问了 google 但找不到替代的 CDI 扩展 Question 是否有 CDI 扩展可以处理通用类型事件的事件传播 下面是我遇到的明确问题 我有三个常规事件 En
  • axios 请求中未发送正文数据

    我试图通过 axios 请求将数据发送到我的后端脚本 但正文看起来是空的 这是前端发送的请求 axios request method GET url http localhost 4444 next api headers Authori
  • Kubernetes - 尝试部署时“安装卷失败”

    我部署了第一个容器 我得到了信息 deployment apps frontarena ads deployment created 但后来我看到我的容器创建陷入等待状态 然后我看到日志使用kubectl describe pod fron
  • MailTo 从 Javascript

    我有一个链接按钮 用于从页面内容构建邮件 从 javascript 启动它而不打开空白窗口或干扰调用它的窗口的最佳方法是什么 function Email var sMailTo mailto var sBody var alSelecte
  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • 为什么即使当我尝试从工作线程更改 UI 时,同步上下文仍为空?为什么即使我不这样做,工作线程也会在 UI 线程上等待?

    我在表单上有一个按钮 点击它我调用FooAsync并在完成时阻止 UI 线程 下面是代码和我的问题 using System using System Diagnostics using System Threading using Sys
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • CMake“项目”指令的正确用法是什么

    我有一个很大的代码库 它构建了几十个库和几个可执行文件 代码库按层次结构进行分解 并且几乎在每个级别都构建了库 我已经仔细检查并在每个目录中放置了一个 CMakeLists txt 文件来构建每个库 在每个 CMakeLists txt 中