2

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

root
    include
        a.h
    src
        a.cpp

我可以将库上的 header_namespace 设置为,例如examples/liba,这样在使用 libA 的单独项目中,我可以:

#include "examples/liba/a.h"

这很好,因为它允许我在我的项目中保持一个简化的目录结构,同时也让我的包含以一种更具可读性的方式进行组织。

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

4

1 回答 1

1

不,CMake 没有这样的设施。

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

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内容的任何人都可用(相对于安装前缀进行解释)。includelibainclude

然后安装通常是这样的:

install(DIRECTORY include/
  DESTINATION include)

对于标题,在源包含目录下安装所有内容和

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

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

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

#include "liba/a.h"

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

于 2017-08-03T16:03:17.030 回答