带有子目录的 CMake

2024-02-17

我正在尝试设置我的项目以使用 CMake 正确编译。

我的目录如下所示:

root
 |- bin
 |   |- // Where I want to build CMake from - using 'cmake ..'
 |- build
 |   |-
 |- include
 |   |- database
 |   |    |- database.h
 |- src
     |- database
     |    |- database.cpp
     |- main
          |- main.cpp

随着我的项目变大,我的子目录肯定会增长,并且我认为 CMake 可能是一个学习的好主意。目前我只能让 CMake 在 src/ 中没有子目录的情况下工作。然而,我确实希望这个项目能够发展成许多子目录。

我需要多个吗CMakeLists.txt每个目录中都有 .cpp 文件吗?有人能指出我正确的方向吗?

谢谢你!


我会推荐你​​去本文 https://crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources/深入讨论两种主要方法,但是您可以通过几种方法来构建这样的项目。

  • One CMakeLists.txt文件位于顶层,列出了所有不同子目录中的所有源文件。您通常只会在非常简单的项目中看到这一点。
  • One CMakeLists.txt每个目录中的文件,每个目录都是由其父目录使用引入的add_subdirectory()。这种方法很常见,通常也是推荐的方法。
  • One CMakeLists.txt文件位于顶层,每个子目录都有自己的文件,其中列出了自己的源文件和目标。顶层CMakeLists.txtfile 引入子目录 filesinclude()。此方法不太常见,但在某些情况下比其他两种方法具有优势。但一般来说这不是推荐的方法。

每个都有其优点和缺点。只有一个顶级CMakeLists.txt仅当文件和子目录很少时才推荐使用 file。一旦项目增长,将所有内容都保留在顶层可能会变得太多,并导致结果CMakeLists.txt文件更难遵循。它还有一个缺点,即文件添加或删除的更改不限于特定目录。这看起来似乎没什么大不了的,但如果多个人正在处理一个项目,并且您想轻松查看其他人的更改影响了项目的哪些部分(例如在 git 历史记录中),那就更难了。如果您都添加/删除文件,从而都更改顶层,则尤其如此CMakeLists.txt文件并有可能发生冲突。

一旦项目规模变得不小,大多数人都会选择添加一个CMakeLists.txt每个子目录中的文件并使用add_subdirectory()把他们聚集在一起。 @TheQuantumPhysicist 的回答给出了一个很好的例子,说明了这如何有用,所以我不会在这里重复大部分细节。这种结构使您能够轻松打开/关闭构建树的整个部分,但更重要的是,它为每个子目录提供了自己的变量范围。如果您想在源树的一部分中设置变量等,但这些更改在另一部分中不可见,那么这一点可能很重要。每个子目录也有自己的目录属性范围。这些单独的作用域使您可以更轻松地将编译器标志和其他临时值等内容应用于复杂目录结构的一部分。

第三种选择 一级CMakeLists.txt文件,每个子目录提供一个由以下命令引入的文件include()不太常见,但它与使用一种有相似之处CMakeLists.txt每个子目录中的文件。两者都将目录中文件的详细信息本地化到CMakeLists.txt或该目录中其他类似名称的文件。因此,在版本控制历史等中,更改变得更容易合并和理解。当使用 CMake 3.12 或更早版本时,第三种方法允许的一件事是你可以使用第二种方法不允许的事情target_link_libraries()使用时更自由一点target_sources()指定每个子目录中的源文件。本答案顶部链接的文章详细介绍了原因target_sources()可以是有利的。如果您的最低 CMake 版本是 3.13 或更高版本,则第三种方法不如第二种,通常应避免。

最后,我建议您不要养成将构建树放在源树中的习惯。相反,将构建树创建为源树的同级树。旨在保持您的源代码树不受构建影响。所需要的只是让某人在源树中创建一个目录,其名称与您用于构建树的目录相同,否则就会出现问题(我不止一次看到过这种情况!)。您可能还想为一个源树设置多个构建树,例如一个用于调试构建,另一个作为发布构建,因此将这些构建树放在源树之外也有助于保持源树不那么混乱。

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

带有子目录的 CMake 的相关文章

随机推荐

  • 如何在本机 C++ 项目中使用 tlb 文件

    我有一个 tlb 文件 其中包含一些我需要使用的函数声明 If I use import type library tlb 我可以从我的代码中正确引用该函数 tlb namespace required function 但是当我编译项目时
  • AVfoundation 反向视频

    我尝试制作反向视频 在 AVPlayer 中播放资源时 我将速率设置为 1 以使其以反向格式工作 但如何导出该视频呢 我查看了文档 阅读有关 avassetwrite sambuffers compositions 的内容 但没有找到任何方
  • Python Pygame 无法正确显示图像

    我是 Python 新手 我开始学习 Eric Matthes 的 Python 速成课程 我在 Pygame 章节的开头 遵循代码 但我加载的图像总是看起来损坏 我不知道为什么 代码来自书本 第一个文件 import pygame cla
  • Kivy RecycleView 作为 ListView 的替代品?它是如何工作的?

    我应该先说一下 我仍然是 Kivy 的新手 我尝试寻找类似的问题 但它们要么过时 要么不清楚 我正在寻找一些东西来显示元素列表 用户可以在其中选择一个元素来与其他小部件 按钮等 进行交互 我偶然发现了ListView 上的文档页面 http
  • 帮助理解 PHP5 错误

    简而言之 问题是 说什么 扩展 我没有收到错误 严格标准 非静态方法 Pyro Template preLoad 不应静态调用 假设 this 来自 opt lampp htdocs dc pyro app controllers admi
  • 选择 Xamarin Forms 中存储文件的路径

    我有一个 Xamarin 表单应用程序 我想保存文件 当用户在手机中打开文件管理器或手机连接到计算机时 应该显示该文件 我读了这个article https developer xamarin com guides xamarin form
  • Openblas 没有链接到 Scipy

    我目前在 Debian Jessie 上运行 scipy 我已经从 apt get 安装了 scipy 我还从 apt 安装了 blas 和 lapack sudo apt get install python scipy libblas
  • MySQL-SUM 日期时间?

    我需要总和日期时间值 但我不知道如何做到这一点 我有桌子 我的查询 SELECT SUM h dtplay AS Time FROM tblhistory AS h tblgame AS g WHERE h idgame g id AND
  • 允许在 asp.net 文本框中使用 html

    我将 ValidateRequest false 添加到页面指令中 但页面的行为就像没有回发一样 如果我删除 html 那么它会正常回发 使用更新面板内的文本框应该不会产生影响 对吗 我正在尝试使用 html 格式将文本存储在我的数据库中
  • Qt 全局样式表加载?

    如何使用 Qt 全局加载样式表 qss 样式资源 我正在努力让事情变得比以下更有效率 middleIntText gt setStyleSheet QLineEdit border 1px solid gray border radius
  • 是否可以将 LIMIT 与子查询结果一起使用?

    当需要有序集的最后几行时 通常会创建派生表并重新排序 例如 返回自动递增表的最后 3 个元素id SELECT FROM SELECT FROM table ORDER BY id DESC LIMIT 3 t ORDER BY t id
  • \n 在 Sklabel SpriteKit 中不起作用

    我在我的游戏中使用了以下代码 问题是我无法像使用 CCLabelTTF 那样在 spritekit 中制作多行标签 有人可以帮助我吗 另外我无法在我的代码中使用 t 或 n 感谢您的提前回复 SKLabelNode winner SKLab
  • C++11 std::threads 并等待线程完成

    我有一个计时器对象向量 每个计时器对象都会启动一个模拟生长期的 std thread 我正在使用命令模式 发生的情况是每个计时器都被一个接一个地执行 但我真正想要的是一个被执行 然后一旦完成 下一个 一旦完成下一个 同时不干扰主程序的执行
  • 工具提示内的图像tiptip

    我需要在具有悬停效果的工具提示中插入图像 tel view tipTip defaultPosition top delay 400 fadeIn 400 keepAlive true activation click HTML img s
  • 多个神经网络各有一个输出还是一个有多个输出?

    我想将输入分类为三种可能性之一 使用 3 个网络 每个网络有一个输出 还是 1 个网络 每个网络有 3 个输出 更好 即 3 个网络输出0 or 1或 1 个输出长度为 3 的单热向量的网络 1 0 0 答案是否会根据输入数据分类的复杂程度
  • 无法在 Keras 中复制 matconvnet CNN 架构

    我在 matconvnet 中有以下卷积神经网络架构 我用它来训练我自己的数据 function net cnn mnist init varargin CNN MNIST LENET Initialize a CNN similar fo
  • 在 lambda 中使用 aws-sdk 吗? (AWS.ApiGatewayManagementApi 不是 Response 的构造函数)

    我正在尝试在 lambda 中使用 aws sdk 但我似乎无法弄清楚 var AWS require aws sdk AWS config update var DDB new AWS DynamoDB apiVersion 2012 1
  • 使用 Bootstrap 3 垂直居中元素

    我想将 设计 标签和 21nov 垂直居中 div class row div class col xs 6 col xs offset 1 a href job 52 span class jobtitle designer span a
  • 调整 div 大小以适应最大高度的内容

    我有一个包含动态内容的 div 当内容加载到 div 中时 我希望调整 div 大小以适应内容 但我希望此调整大小具有最大高度 如果内容需要超过这个最大高度 我希望有一个滚动条 我已经搜索过这里的问题 但无法找到我要找的东西 除了提问者回答
  • 带有子目录的 CMake

    我正在尝试设置我的项目以使用 CMake 正确编译 我的目录如下所示 root bin Where I want to build CMake from using cmake build include database database