包含子库和包含目录的库,如何在CMake中执行?

时间:2018-05-29 17:01:40

标签: c++ cmake

我有一个以这种方式构建的项目:

project
 |\_subdir
 |   | Some .cxx files
 |   | some .h files (included with #include "foo.h"
 |    \_subdir
 |       | Some .h files (included with #include <subdir/foo.h>)
  \_subdir2
     | some .cxx files
     | some .h files (included with #include "foo.h"
      \_subdir2
         | Some .h files (included with #include <subdir2/foo.h>)

我需要在这里做一些事情:

  1. subdir/subdir目录应公开提供,以便在将此库与#include <subdir/foo.h>一起使用的程序中使用。
  2. subdir目录应该生成自己的静态链接库,以便我可以运行测试,确保维护不同子目录之间的依赖关系。
  3. 整个事情应该产生一个共享或静态库,其中包含所有subdir目录中的所有内容,并且可以使用此库链接到程序。
  4. 目前我有一个使用autotools(但不是automake)制作的构建系统以及一些定制的perl脚本,这些脚本处理-M标志的依赖项输出并创建表示依赖项信息的自定义makefile。此外,他们创建了一个包含链接农场的包含目录,因此每个人都可以使用#include <subdir/foo.h>,只使用-I linkfarm目录。

    我想将其转换为CMake,但我不知道如何处理子目录结构和包含。如果绝对必要,我可以稍微重新安排目录结构,但我非常希望保留各个子目录的伪独立性,部分原因是因为能够确保子目录对我来说非常重要-libraries具有特定的依赖关系,作为维护模块化和清洁的一种方式。

    我如何在CMake中执行此操作?我是否已移动subdir/subdir目录?

    因为看起来我将subdir目录添加为公共包含,所以事情会非常糟糕,因为人们会在subdir级别看到私有.h文件并且能够包含其中的.cxx文件。更糟糕的是,他们会将它们视为顶级包含(即#include <bar.cxx>,其中bar.cxx是私有实现文件,其目标代码应该已经在库中。)

    但是如果将subdir/subdir添加为包含目录,那么.h个文件就不会出现在子目录中(例如#include <subdir/public.h>无法正常工作,而是I&I #39;我必须使用#include <public.h>,这根本不是我的意图。

1 个答案:

答案 0 :(得分:2)

如果您对图书馆的用户感到烦恼,他们会看到安装的文件,而不是 / build < / em>目录。如果您不安装私有标头(来自subdir/),则用户将看不到它们。

但是如果您不打算安装库,那么您可以分隔公共和私有包含树。例如。每个项目可以直接在其源目录中包含私有标头,并在其include/子目录下包含 public 标头:

  project
 |\_subdir
 |   | Some .cxx files
 |   | Private .h files (included with #include "foo.h")
 |    \_include (public include directory)
 |       \_subdir
 |         | Public .h files (included with #include <subdir/foo.h>)
  \_subdir2
     | some .cxx files
     | Private .h files (included with #include "foo.h")
      \_include (public include directory)
         \_subdir2
           | Public .h files (included with #include <subdir2/foo.h>)