6

我有两个静态库:libfoolibbar,每个都在自己的目录中。

libfoo包含一个includes/包含单个文件的目录A.h。它还包含一个sources/目录,其中包含B.gen. 自定义规则应该创建一个新的头文件B.h和一个新的源文件B.c

libbar包含一个includes/包含单个文件的目录C.h。它还包含一个sources/目录,其中包含C.c. 该文件包括A.hB.h来自libfoo

问题是:根据这些规则,我该如何编写两个库的 CMakeFiles.txt (据我了解,棘手的部分是将所有 libfoo 标头放在同一目录中,但也许我有误导性)?

文件层次结构:

/
  libfoo/
    includes/
      A.h
    sources/
      A.c
      B.gen
    CMakeLists.txt
  libbar/
    includes/
      C.h
    sources/
      C.c
    CMakeLists.txt
4

1 回答 1

3

您不应将任何生成的文件复制到源目录。源目录和构建目录之间的分离是有意的,并且称为源外构建,以免在构建过程中使用生成的文件污染源目录。

在这种情况下,您需要做的是:

  1. 定义一个自定义命令,使用 add_custom_command 将您的 B.gen 转换为 Bh 文件。这将在 CMAKE_CURRENT_BINARY_DIR 中生成 Bh,它反映了 CMakeLists.txt 相对于项目根 CMakeLists.txt 的源目录。它看起来像这样:

    add_custom_command(输出 Bh 命令 my-gen B.gen Bh DEPENDS B.gen)

  2. 使用 include_directories 函数将生成文件的文件夹添加到包含目录。如果所有这些都在一个 CMakeLists.txt 中完成,您可以使用 include_directories(${CMAKE_CURRENT_BINARY_DIR})

CMake 依赖解析器现在将在它想要构建 Cc 时分析其内容并找出构建它所需的 Bh。使用 add_custom_command 您已经告诉它如何创建该标头,它将调用您的生成器。

您应该查看 CMake 中的源代码构建如何工作以正确理解文件夹层次结构。

于 2013-08-26T13:41:55.057 回答