1

我对cmake感到崩溃。在这个答案之后,我尝试制作一个简单的示例并将其放在 github 中,因为目录中有很多文件,在这里复制所有内容可能会很无聊。

我想做的是构建一个简单的框架来处理我的 qt/opencv/opengl 实验。我喜欢的是一个包含这些目录的存储库:

 root*
   |-apps
   |---test1*
   |
   |-build
   |-cmake*
   |
   |-modules
   |---foo*

(* 签名的目录是包含一些 cmake 文件的目录,例如 CmakeLists.txt 或 FindXXModule.cmake)

在模块中,我可以编写模块(例如用于面部识别的模块,用于在 opengl 中绘制红色立方体的模块,包含我个人 qt 小部件扩展的模块)。

比我需要一种简单的方法来创建应用程序并在其上链接一些模块。为此,我想创建一个 cmake 目录来放置 FindXXModule.cmake 并在应用程序中说:find_package(XXModule)

请注意,现在我不关心安装这个存储库,树结构必须是这个(所以如果我在应用程序/test2 中,我知道我可以将 cmake 目录作为../../cmake或模块目录引用../../modules

我写了一个test1使用该模块的名为应用程序的小示例,foo并将其放在github 存储库中。

现在我可以test1使用 cmake 调用来编译应用程序,cmake path_to_test1_CmakeLists.txt对此我很高兴。但是,如果我尝试启动cmake path_to_root_CmakeLists.txt它,它就不起作用,因为该文件Findfoo.cmake被读取了两次(而且我无法使用一些if不读取它两次)。

然后,如果我运行 test1 cmake,则会在其中创建一个带有 cmake 缓存等的 foo 目录,root/cmake但我不想要它。我希望 cmake 必须生成的所有文件都在root/build目录中。

所以,这些是我的两个问题:

  • 如何创建一个可以构建所有应用程序和所有未来测试的 CmakeLists.txt,我将在模块目录中编写
  • 如何避免启动单个应用程序的 cmake 会在 cmake 目录中创建文件。

抱歉,如果我的英语和我对 cmake 工作原理的想法不好......我希望它很清楚。

编辑:

还有一件事。在 Findfoo.cmake 我有一个不好的 hack:当我从 test1 调用 cmake 时,为了在 modules/foo 中添加真正的 CMakeLists.txt 我必须添加一个不在树中的子目录。也许这种 hack 可能是删除审查整个结构..

4

1 回答 1

0

正如您所说,您想将整个目录结构放入源代码管理中。这意味着这些文件夹结构在您进行结帐的每个位置都是相同的。那么,如果您有 foo 目录的相对路径,为什么还要创建 Findfoo.cmake 呢?

我建议将 CMakelists.txt 文件放入添加所有子目录的根目录中。为了减少 CMake 生成的文件和原始文件之间的混淆,您应该创建一个名为 ./build(甚至是 ../build)的文件夹并在该目录中运行 CMake,并将根目录作为第一个参数。这会在 ./build 目录中创建所有 CMake 生成的文件,并让您可以轻松清理它。这种工作方式称为外源构建,强烈建议以这种方式使用 cmake。有关示例,请参见此问题。

于 2013-06-24T06:49:06.040 回答