【问题标题】:CMAKE for a build a simple frameworkCMAKE 用于构建一个简单的框架
【发布时间】:2013-06-23 18:41:00
【问题描述】:

cmake 让我心烦意乱。在this answer 之后,我尝试做一个简单的例子并将其放在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 repository 中。

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

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

所以,这是我的 2 个问题:

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

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

编辑:

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

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

    【讨论】:

    • 但是这样我就失去了编译单个应用程序的可能性
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2020-03-12
    • 2022-07-06
    • 2012-03-01
    • 1970-01-01
    • 2015-08-25
    • 2016-09-05
    相关资源
    最近更新 更多