不知何故,我对 CMake 的工作方式感到完全困惑。每次我认为我越来越接近理解 CMake 的编写方式时,它在我阅读的下一个示例中消失了。我只想知道,我应该如何构建我的项目,以便我的 CMake 在未来需要最少的维护。例如,当我在我的 src 树中添加一个新文件夹时,我不想更新我的 CMakeList.txt,它的工作方式与所有其他 src 文件夹完全相同。
这就是我想象我的项目结构的方式,但这只是一个例子。如果推荐的方式不同,请告诉我,并告诉我该怎么做。
myProject
src/
module1/
module1.h
module1.cpp
module2/
[...]
main.cpp
test/
test1.cpp
resources/
file.png
bin
[execute cmake ..]
顺便说一句,我的程序知道资源在哪里很重要。我想知道管理资源的推荐方式。我不想使用“../resources/file.png”访问我的资源
原文由 Arne 发布,翻译遵循 CC BY-SA 4.0 许可协议
经过一番研究,我现在有了自己版本的最简单但完整的 CMake 示例。在这里,它试图涵盖大部分基础知识,包括资源和包装。
它做的一件非标准的事情是资源处理。默认情况下,CMake 想要将它们放在 /usr/share/、/usr/local/share/ 和 Windows 上的等效项中。我想要一个简单的 zip/tar.gz,你可以在任何地方解压并运行。因此,资源是相对于可执行文件加载的。
理解 CMake 命令的基本规则是以下语法:
<function-name>(<arg1> [<arg2> ...])
不带逗号或分号。每个参数都是一个字符串。foobar(3.0)
和foobar("3.0")
是一样的。您可以使用set(args arg1 arg2)
设置列表/变量。使用此变量集foobar(${args})
和foobar(arg1 arg2)
实际上是相同的。不存在的变量相当于一个空列表。列表在内部只是一个用分号分隔元素的字符串。因此,只有一个元素的列表根据定义就是那个元素,不会发生装箱。变量是全局的。内置函数提供某种形式的 _命名参数_,因为它们期望在它们的参数列表中使用一些 id,如PUBLIC
或DESTINATION
来对参数进行分组。但这不是语言特性,这些 id 也只是字符串,并由函数实现解析。您可以从 github 克隆所有内容
注意:虽然
file(GLOB)
的上述用法在这里是合适的,但该问题专门要求一种技术,以通过添加新的源文件来最大限度地减少对 CMakeLists.txt 文件的编辑频率,但 在官方文档,以及这些专门问题的答案: #1 、 #2 。