如何在CMake中包含具有项目相对路径的目录?

时间:2015-04-11 20:35:43

标签: c++ visual-studio cmake

我正在使用CMake开发团队产品。我们在CMake项目中有几个Visual Studio项目(库和可执行文件),它们引用其他项目头文件(通过target_include_directories())。在源文件中,这些标头包括:

#include "some_header.h"    // from project_x
#include "another_header.h" // from project_y

我希望能够将这些标题包含在引用它们的项目的路径中,例如:

#include "project_x/some_header.h"
#include "project_y/another_header.h"

最可接受的方式是什么?我想到了几个解决方案:

  1. 将包含项目的目录添加为包含路径。这包含所有的不良副作用,似乎是一个糟糕的解决方案。

  2. 包含名为“include”的项目的子文件夹,其中包含一个与项目名称相同的文件夹,这会创建一个稍微冗余的路径:/<project_name>/include/<project_name>/<...>

  3. 还有第三个解决方案,为每个项目使用一个包含子文件夹的共享包含目录,但它不适用于我们的项目,因为我们在文件系统和Visual Studio解决方案中按类别对我们的构建项目进行分组,这将导致/include/内部的文件夹结构与源树的其余部分分开,这是不可取的。

    有没有更好的(或更多规范/惯用)方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果你有这样的项目结构:

project_x/some_header.h
project_y/another_header.h

并且您希望将所有的CMakeLists保持不变,然后我会在每个项目中引入另一个文件夹:

project_x/project_x/some_header.h
project_y/project_y/another_header.h

当然,这需要更改每个项目中的包含以反映这个新结构,包括正确定义标题的项目。

这有一些优先权,因为curlgoogletest就是这样做的。

编辑:我理解这与您概述的第二种方法非常相似。如果您的目录结构已经使用include目录,那么我的建议与您的第二个完全相同。至少,这应该证实你的直觉,这不是一个完全荒谬的事情,即使它创造了一些冗余。