我应该添加标题作为 INTERFACE 目标源,还是只设置一个 INTERFACE 目标包含目录?

问题描述

在使用 CMake 的存储库中,我有一个foo 编译的库 foo.c。还有一个文件 foo.h,为了讨论起见,仅在针对 foo 编译代码时才需要它。编译后的库和 foo.h 都已安装。

现在,我应该如何向依赖目标“宣布”foo.h?我应该写:

target_sources(foo INTERFACE "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>/foo.h")

,或者:

target_include_directories(foo INTERFACE "$<BUILD_INTERFACE:${GENERATED_INCLUDE_DIR}>")

或者 - 也许两者都有?

解决方法

只有后者。 foo.h 不是链接者的第一方来源之一,而这正是 (INTERFACE_)SOURCES 应该建模的。然后目标 foo 才能被使用,要求被链接者可以找到它的头;那些属于 INTERFACE_INCLUDE_DIRECTORIES(其中 target_include_directories 组)。