我怎样才能build立一个C + +项目与多个相互依存的子目录?

我有一个C ++项目,我用目录作为更多的组织元素 – 可以使用Java中的包或PHP中的目录。 目录并不是要成为自给自足的元素,而只是组织整个项目的一种方式,不让我被来源所压倒。 我怎样才能构build我的CMakeLists.txt文件来处理这个? 制作目录库在这里似乎不太合适,因为它们都是相互依赖的,并不打算以这种方式使用。

作为一个相关的问题,我见过的CMake中的多个子目录的大多数例子(并不是很多)忽略或掩盖了设置include_directories的问题,这是我一直遇到的问题。 短的梳理我的源文件,以确定哪个文件取决于哪个和哪个目录,有没有办法将/src/下的所有目录设置为潜在的包括目录,并让CMake确定哪些是实际依赖?

这是一个示例结构:

 --src --top1 --mid1 --bot1 --src1.cpp --hdr1.h --bot2 --src2.cpp --hdr2.h --mid2 --bot3 --src3.cpp --src4.cpp --hdr3.h --top2 --mid3 --src5.cpp --hdr4.h 

等等等等。 我怎样才能构build我的CMakeLists.txt文件来处理这种结构?

由于项目中的目录结构只是为了保持文件的组织,一种方法是使用CMakeLists.txt自动查找src目录中的所有源文件,并将所有目录添加为包含头文件的包含目录。 下面的CMake文件可以作为一个起点:

 cmake_minimum_required(VERSION 3.0) project (Foo) file(GLOB_RECURSE Foo_SOURCES "src/*.cpp") file(GLOB_RECURSE Foo_HEADERS "src/*.h") set (Foo_INCLUDE_DIRS "") foreach (_headerFile ${Foo_HEADERS}) get_filename_component(_dir ${_headerFile} PATH) list (APPEND Foo_INCLUDE_DIRS ${_dir}) endforeach() list(REMOVE_DUPLICATES Foo_INCLUDE_DIRS) add_executable (FooExe ${Foo_SOURCES}) target_include_directories(FooExe PRIVATE ${Foo_INCLUDE_DIRS}) 

这两个file(GLOB_RECURSE ...命令决定了源文件和头文件的集合, foreach循环从所有头文件的列表中计算包含目录集合。

计算源文件集的一个缺点是,CMake不会自动检测何时将新文件添加到源树中。 您手动必须重新创build您的构build文件。

我不是CMake方面的专家,但是因为没有其他的答案,所以我会看一下这个文档,并给它一个提示。 将源文件和包含文件组织在不同的目录中几乎是常态。

它看起来像CMake允许您提供包含目录的列表: http : //www.cmake.org/cmake/help/cmake-2-8-docs.html#command : include_directories

所以像这样:

 include_directories("src/top1/mid1/bot1" "src/top1/mid1/bot2/" ... ) 

这些传递给编译器,以便它可以find头文件,并将传递给每个源文件。 所以你的任何源文件应该能够包括任何头文件(我认为是你所要求的)。

类似于你应该能够在add_executable命令中列出你所有的源文件:

 add_executable(name "src/top1/mid1/bot1/src1.cpp" "src/top1/id1/bot2/src2.cpp" ...) 

所以这将是一个无所不能的方法来build立一切。 每个源文件都将被编译,并将在所有这些目录中查找标题,然后这些目标文件将被链接在一起。 考虑是否有任何简化的方法,使得你不需要这么多的包含文件夹,也许只有几个常见的头文件需要被所有的源文件引用。 如果事情变得更复杂,可以将子层次结构编译到库中。还可以考虑分离源文件和头文件(例如在src和include中)。