我有一个以这种方式构建的项目:
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>)
我需要在这里做一些事情:
subdir/subdir
目录应公开提供,以便在将此库与#include <subdir/foo.h>
一起使用的程序中使用。subdir
目录应该生成自己的静态链接库,以便我可以运行测试,确保维护不同子目录之间的依赖关系。subdir
目录中的所有内容,并且可以使用此库链接到程序。目前我有一个使用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>
,这根本不是我的意图。
答案 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>)