BUCK构建工具允许我为库定义头名称空间。例如,如果我有一个名为libA的库,则具有以下目录结构:
root
include
a.h
src
a.cpp
我可以在库上设置一个header_namespace,比如examples/liba
,这样在一个使用libA的单独项目中我可以:
#include "examples/liba/a.h"
这很好,因为它允许我在我的项目中保留简化的目录结构,同时保持我的包含以更具可读性的方式组织。
CMake会提供这样的东西吗?我还没有发现类似的东西。我的目标是让BUCK和CMake构建文件,以便在没有java(BUCK依赖项之一)的系统上更容易构建。
答案 0 :(得分: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
在当前源目录中的子目录include
的内容和任何安装liba
include
内容的人的包含路径上可用子目录(相对于安装前缀解释)。
然后安装通常类似于:
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"
所以,除非你真的很难命名,否则不应该对文件或代码产生任何冲突!