如何在 CMake 中包含具有项目相对路径的目录?
How can I include directories with project relative paths in CMake?
我正在与使用 CMake 的团队一起开发产品。我们的 CMake 项目中有几个 Visual Studio 项目(库和可执行文件),它们引用其他项目 header(通过 target_include_directories()
)。在源文件中,这些 header 包含如下所示:
#include "some_header.h" // from project_x
#include "another_header.h" // from project_y
我希望能够将这些 header 包含在引用它们从中提取的项目的路径中,例如:
#include "project_x/some_header.h"
#include "project_y/another_header.h"
最容易接受的方法是什么?我想到了几个解决方案:
添加包含项目的目录作为包含路径。这有不受欢迎的 side-effect 包括 一切 并且似乎是一个糟糕的解决方案。
包含一个名为'include'的项目的子文件夹,其中包含一个与项目同名的文件夹,这会创建一个稍微冗余的路径:/<project_name>/include/<project_name>/<...>
还有第三种解决方案,为每个项目使用一个包含子文件夹的共享包含目录,但它不适用于我们的项目,因为我们在文件系统中按类别对构建项目进行分组,Visual Studio解决方案,它会导致 /include/
内的文件夹结构与源代码树的其余部分不同,这是不可取的。
有没有更好的(或更多canonical/idiomatic)方法来完成这个?
如果您有这样的项目结构:
project_x/some_header.h
project_y/another_header.h
并且你想让你的 CMakeLists all 保持不变,那么我会在每个项目中引入另一个文件夹:
project_x/project_x/some_header.h
project_y/project_y/another_header.h
当然,这需要更改每个项目中的包含以反映此新结构,包括正确定义 header 的项目。
这有一些优先级,因为这是 curl and googletest 的做法。
编辑:我知道这与您概述的第二种方法非常相似。如果您的目录结构已经使用 include
个目录,那么我的建议与您的第二个完全相同。至少,这应该证实你的直觉,即这不是一件完全荒谬的事情,即使它会产生一些冗余。
我正在与使用 CMake 的团队一起开发产品。我们的 CMake 项目中有几个 Visual Studio 项目(库和可执行文件),它们引用其他项目 header(通过 target_include_directories()
)。在源文件中,这些 header 包含如下所示:
#include "some_header.h" // from project_x
#include "another_header.h" // from project_y
我希望能够将这些 header 包含在引用它们从中提取的项目的路径中,例如:
#include "project_x/some_header.h"
#include "project_y/another_header.h"
最容易接受的方法是什么?我想到了几个解决方案:
添加包含项目的目录作为包含路径。这有不受欢迎的 side-effect 包括 一切 并且似乎是一个糟糕的解决方案。
包含一个名为'include'的项目的子文件夹,其中包含一个与项目同名的文件夹,这会创建一个稍微冗余的路径:
/<project_name>/include/<project_name>/<...>
还有第三种解决方案,为每个项目使用一个包含子文件夹的共享包含目录,但它不适用于我们的项目,因为我们在文件系统中按类别对构建项目进行分组,Visual Studio解决方案,它会导致 /include/
内的文件夹结构与源代码树的其余部分不同,这是不可取的。
有没有更好的(或更多canonical/idiomatic)方法来完成这个?
如果您有这样的项目结构:
project_x/some_header.h
project_y/another_header.h
并且你想让你的 CMakeLists all 保持不变,那么我会在每个项目中引入另一个文件夹:
project_x/project_x/some_header.h
project_y/project_y/another_header.h
当然,这需要更改每个项目中的包含以反映此新结构,包括正确定义 header 的项目。
这有一些优先级,因为这是 curl and googletest 的做法。
编辑:我知道这与您概述的第二种方法非常相似。如果您的目录结构已经使用 include
个目录,那么我的建议与您的第二个完全相同。至少,这应该证实你的直觉,即这不是一件完全荒谬的事情,即使它会产生一些冗余。