c++ - 是否有与 BUCK 的 header_namespace 等效的 cmake?

标签 c++ cmake buck

BUCK 构建工具允许我为库定义 header 命名空间。例如,如果我有一个名为 libA 的库,其目录结构为:

root
    include
        a.h
    src
        a.cpp

我可以在库中设置一个 header_namespace,比如 examples/liba,这样在一个使用 libA 的独立项目中我可以:

#include "examples/liba/a.h"

这很好,因为它允许我在我的项目中保留一个简化的目录结构,同时还使我的包含以更具可读性的方式组织起来。

CMake 是否提供类似的东西?我还没有找到类似的东西。我的目标是拥有 BUCK 和 CMake 构建文件,以便在没有 java(BUCK 的依赖项之一)的系统上更容易构建。

最佳答案

不,CMake 没有这样的设施。

管理 header 的标准方法是以不太可能与其他代码冲突的方式在文件系统中组织它们。

root
    include
       liba
            a.h
    src
       a.cpp

那么这是一个简单的问题:

include_directories(include)

或更好,

target_include_directories(liba PUBLIC include)

或者,最现代的,

target_include_directories(liba PUBLIC
  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
  "$<INSTALL_INTERFACE:include>")

这只是说在包含路径上提供给任何使用 liba 的人子目录的内容 include在当前源目录和任何安装 liba 的人include的内容子目录(相对于安装前缀解释)。

然后安装通常是这样的:

install(DIRECTORY include/
  DESTINATION include)

对于 header ,将所有内容安装在源包含目录和

install(TARGETS liba
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib)

用于实际的库目标(“libliba.a”或“libliba.so”)。更好的是使用来自 include(GNUInstallDirs) 的变量用于 GNU 标准文件夹名称。

在您的代码中,您始终只需以通常的无冲突方法引用代码:

#include "liba/a.h"

所以,文件或代码永远不应该有任何冲突,除非你真的不擅长命名!

关于c++ - 是否有与 BUCK 的 header_namespace 等效的 cmake?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45486407/

相关文章:

c++ - 将另一个窗口嵌入为 QWidget

c# - 尝试使用来自 bp-kelley/rdkit-csharp 的 build.bat 为 RDKit 构建 C# 包装器

c++ - 如何从 C++ 中选择 TableView (qml) 中的行?

c++ - qt/c++ 上下文菜单 - 禁用一个项目

c++ - qmake 到 cmake 转换和链接错误

c++ - 在 Buck 中,如何使用 genrule 的输出作为 cxx_library 的 header ?

android - 如何在 Android Studio 中使用 Facebook Buck 构建工具?

buck - 如何在 Buck 中运行特定测试?

c++ - Keil:虚拟或 protected 析构函数和堆

c++ - 如何在没有外部脚本的情况下链接 CMake 和 SQLite?