单个 CMakeLists.txt 足以满足我的项目需求吗?

2024-04-25

我正在尝试将旧的 CMake 移植到现代 CMake(CMake 3.0.2 或更高版本)。在旧的设计中,我有多个 CMakelists.txt,每个目录都包含一个 CMakeLists.txt 文件。

我当前项目的目录结构如下所示:

.
├── VizSim.cpp
├── algo
├── contacts
│   ├── BoundingVolumeHierarchies
│   │   └── AABBTree.h
│   └── SpatialPartitoning
├── geom
│   └── Geometry.h
├── math
│   ├── Tolerance.h
│   ├── Vector3.cpp
│   └── Vector3.h
├── mesh
│   ├── Edge.h
│   ├── Face.h
│   ├── Mesh.cpp
│   ├── Mesh.h
│   └── Node.h
├── util
|   |__ Defines.h
|   |__ Math.h
|
└── viz
    └── Renderer.h

我打算做的只是使用一个 CMakelists.txt 并将所有 cpp 文件放在 SOURCE 中,将所有标头放在 HEADER 中,然后使用 add_executable。

set (SOURCE
    ${SOURCE}
    ${CMAKE_CURRENT_SOURCE_DIR}/src/mesh/Mesh.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/math/Vector3.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/VizSim.cpp
    ....
)

set (HEADER
    ${HEADER}
    ${CMAKE_CURRENT_SOURCE_DIR}/src/mesh/Mesh.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/math/Vector3.h
    .... 
)

add_library(${PROJECT_NAME} SHARED ${SOURCE})

这样做我担心使用单个 CMakeLists.txt 是否是一个好的做法。那么单个 CMakeLists.txt 就足够了,还是每个文件夹都需要一个 CMakeLists.txt ?

我只能想到一个在我的项目中拥有多个 CMakeLists.txt 的充分理由,那就是模块化。

考虑到我的项目最终会成长。


对于评论来说有点长——所以我把它作为一个答案:

在我的一个项目(一个库)中,我有很多源,我开始将其中一些源移动到子目录中util.

为此,我创建了单独的变量:

file(GLOB headers *.h)
file(GLOB sources *.cc)
file(GLOB utilHeaders
  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}/util/*.h)
file(GLOB utilSources
  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}/util/*.cc)

为了使其在 VisualStudio 中美观/更方便,我插入了source_groups 在 VS 项目中生成适当的子文件夹。我相信它们被称为“过滤器”。

source_group("Header Files\\Utilities" FILES ${utilHeaders})
source_group("Source Files\\Utilities" FILES ${utilSources})

当然,我必须考虑变量utilHeaders and utilSources以及必须提供来源的地方:

add_library(libName
  ${sources} ${headers}
  ${utilSources} ${utilHeaders})

就是这样。


Fred https://stackoverflow.com/users/1028434/fred在他的评论中提醒我不应该忘记提及这一点file(GLOB有一定的弱点(尽管我发现它在我们的日常工作中非常有价值)。这甚至在CMake 文档。 https://cmake.org/cmake/help/latest/command/file.html#filesystem:

Note:我们不建议使用 GLOB 从源树中收集源文件列表。如果添加或删除源时 CMakeLists.txt 文件没有更改,则生成的构建系统无法知道何时要求 CMake 重新生成。这CONFIGURE_DEPENDSflag 可能无法在所有生成器上可靠地工作,或者如果将来添加无法支持它的新生成器,则使用它的项目将被卡住。即使CONFIGURE_DEPENDS工作可靠,但每次重建时执行检查仍然有成本。

所以,使用file(GLOB,一旦添加、移动或删除文件,您不应该忘记重新运行 CMake。另一种选择是直接在生成的内置脚本(例如 VS 项目文件)中添加、移动、删除文件,并依赖于下一次重新运行 CMake 也将覆盖这些文件。最后但并非最不重要的一点是,git pull还有其他值得考虑重新运行 CMake 的事情。

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

单个 CMakeLists.txt 足以满足我的项目需求吗? 的相关文章

随机推荐

  • 如何列出已安装的 go 软件包

    据我所知go distribution带有某种package manager After go 1 4 1我已经运行的安装go help为了找到任何能够列出本地安装的子命令go packages 但不幸的是没有 那么该怎么做呢 goinst
  • python: from x import y 改变之前的导入结果

    我试图理解 python 中的包和模块名称隐藏规则 并偶然发现了一种情况 我不明白为什么我看到的结果有意义 这种情况发生在 python 2 中 from future import absolute imports 和Python 3 假
  • HTML5 视频在移动浏览器上自动播放

    我使用以下 HTML5 和 JQuery 代码来播放 URL 位于数组 URLArray 中的视频播放列表 function NextFrag if index lt URLArray length VideoContainer html
  • PHP 数组表示法中的大括号

    我刚刚遇到了一段非常奇怪的 php 代码 oink pig 1 var dump oink oink pig 123123 echo oink pig gt 123123 echo oink pig gt 123123 它的工作原理类似于数
  • TypeScript + NodeJS readline 属性缺失

    我正在使用 TypeScript 开发一个小项目tsc v 2 4 2和节点 v6 10 3 我想在 CLI 中捕获按键 所以我尝试import as readline from readline 然后稍后使用readline emitKe
  • 使用列表项的多重过滤器逻辑

    以下代码将搜索任何重复的类 li class duplicate duplicate 在无序列表中的列表项中 它将显示结果 show and hide 其他的 当前版本 目前它适用于两种场景 First 它显示具有相同类别 至少一个或多个
  • Python 中 FFT 的循环加速(使用“np.einsum”)

    Problem 我想加速包含大量乘积和求和的 python 循环np einsum 但我也愿意接受任何其他解决方案 我的函数采用形状为 n n 3 的向量配置 S 我的情况 n 72 并对 N N 点的相关函数进行傅里叶变换 相关函数定义为
  • 任务 :':app:mergeDebugResources' 执行失败。安卓工作室

    我刚刚安装了 android studio 出现一个错误 我不知道如何修复 尝试干净的项目 如果不起作用的话 然后 转到项目部分中的 build gradle 尝试降级gradle版本 From dependencies classpath
  • 离子范围滑块 2.0.3

    我正在尝试使用离子范围滑块 2 0 3 URL http ionden com a plugins ion rangeSlider demo advanced html http ionden com a plugins ion range
  • 类型错误:无法读取未定义的属性(读取“html”)

    我正在尝试将 Jest 引入我当前的项目 然而 在初始设置过程中 我遇到了这个错误 并且无法正常运行 我该如何解决这个问题 我目前正在使用 vue cli 中的 vue2 Test suite failed to run TypeError
  • 使用 Excel 连接函数

    我正在尝试将 Excel 中三列的数据合并到一列中 例如 我想将 Product Location 和 Key id 合并到一列中 Product Location Key Id Car VA 86421910 Car VA 8642448
  • 在 header("Location: ") 调用后是否调用 exit 有关系吗?

    我似乎无法找到答案 直到我发现这个帖子 http www php net manual en function exit php 90713 on exit在 php net 上 发送 Location 标头 PHP 后will继续解析 h
  • Matlab:不正确的索引矩阵参考(或智胜matlab)

    我希望能够写jasmine http pivotal github io jasmine 类似于 Matlab 中的测试 所以像 expect myfibonacci 0 toBe 0 expect myfibonacci 5 toBe 1
  • C# 与 C++ 中的运算符 new

    来自 C 我对使用newC 中的关键字 我知道它不像 C 那样工作new从某种意义上说 您不必手动控制对象的生命周期 因为 C 具有垃圾收集功能 然而 当阅读其他人的 C 代码时 我注意到代码片段 1 中的语句 避免使用new总而言之 就像
  • 如何在模拟器android studio中设置密度

    我想创建一个 Samsung Galaxy XCover4S 720 x 1280 px 5 00 294ppi 64 6 屏幕与机身比例 的模拟器 但是我只找到了如何设置预定义的密度 如 120 240 320 和更多密度 ppi in
  • 如何识别托管 bean 中单击的 commandButton

    我有一个actionListener我的托管 bean 中的方法由许多命令按钮调用 public void verifyTestDisponibility ActionEvent actionEvent if button1 clicked
  • SQL 作为访问表单字段的控制源

    有什么方法可以使用 SQL 填充 Access Form 的文本字段值吗 我读到不可能简单地输入 SQL 作为控制源 这是真的 谢谢你的帮助 edit 我需要执行这个查询 SELECT tblCaseIssues IssueDesc FRO
  • Chartjs 插件数据标签不在图表上显示值

    我正在尝试使用 Chartjs 数据标签插件获取每个条形上的值 因此 在 a 条上方 a 想要看到数字 30 在 b 条上方或内部我想看到数字 50 但它根本没有显示任何价值 谁能帮忙并告诉我出了什么问题吗 我也尝试过使用不同版本的char
  • 让隐藏的div出现然后消失?

    让 div 出现然后淡出几秒钟的最简单方法是什么 fade div visibility none position fixed background color yellow border 1px solid black top 300p
  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi